LoginSignup
1
2

More than 3 years have passed since last update.

個人的に体験したVivadoエラーまとめ

Last updated at Posted at 2020-11-11

概要

個人的に遭遇したエラーと解決した結果を羅列しました

複数のalways文

module Register(
    input [3:0] in,
    output reg [3:0] out,
    input CLK,
    input Reset
    );

    always @(posedge CLK)
    begin
        out <= in;
    end

    always @ (posedge Reset)
    begin
        out <= 4'h0;
    end

endmodule
[DRC MDRV-1] Multiple Driver Nets:
 Net Register1/out[0] has multiple drivers:
 Register1/out_reg[0]__0/Q, and Register1/out_reg[0]/Q.

image.png

リセットを別にして記述した結果,4bitRegisterを作ろうとしたのに,Registerが2set(8bit)生成されてしまっている.
そして,レジスタ二つの出力が直接接続されてマルチドライバーエラーを起こしている.
always文を一つにまとめれば,解決した

orderd port and named port

[Synth 8-2543] port connections cannot be mixed ordered and named 
multiplexer multi1(.in1(switch[3:0]),in2(switch[7:4]), .out(out), .select(in[0]));

というように,モジュールを接続した際に発生しました.

原因

in2(switch[7:4])

で$.$をつけ忘れているため発生しました.

多bit線の接続

module GAWA(
    input [3:0] in,
    output [3:0] out,
    input [2:0] BTN,
    input [7:0] switch
    );

    multiplexer multi1(.in1(switch[3:0]),.in2(switch[7:4]), .out(out), .select(in[0]));

endmodule

module multiplexer(
    input [3:0] in1,
    input [3:0] in2,
    output[3:0] out,
    input select
    );

    function [3:0] Select;
        input select;
        input in1;
        input in2;
    begin
        if(select == 1)
            Select = in1;
        else
            Select = in2;
     end
     endfunction

     assign out = Select(select,in1,in2);

endmodule

見苦しいコードだが...

結果

image.png
0bit目以降はGNDになってしまっている.実際,FPGAに導入しても同様の結果になる.

原因

function [3:0] Select;
        input select;
        input in1;
        input in2;
    begin
        if(select == 1)
            Select = in1;
        else
            Select = in2;
     end
     endfunction

で input in1,in2 のbitサイズを指定していない.指定しないと1bitになってしまう.
結果,使用するモジュールでおかしなことになる.
これはエラーを吐かないことに驚き.

修正したところ治った.
image.png

思った動作をしない

bit ファイルの選択を別のものにしていたため,ずっと変更されていなかった.
これはバカすぎる.

デマルチプレクサの生成方法

function文,caseで作りました.
[3:0]selectの情報によって,CLKを[15:0]OUTのどれに接続するか選択できます.

module DeMultiplexer(
    input CLK,
    input [3:0] Select,
    output [15:0] Out
    );

    function [15:0]out;
    input [3:0]Select;
    input in;
        case(Select)
            4'h0:out[0] = in;
            4'h1:out[1] = in;
            4'h2:out[2] = in;
            4'h3:out[3] = in;
            4'h4:out[4] = in;
            4'h5:out[5] = in;
            4'h6:out[6] = in;
            4'h7:out[7] = in;
            4'h8:out[8] = in;
            4'h9:out[9] = in;
            default : out = 16'h0000;
        endcase
    endfunction

    assign Out = out(Select,CLK);   

endmodule
module GAWA(
    input clock,
    input [3:0]SW,
    output [3:0]LED
    );

    reg [26:0] D; 
    always @ (posedge clock)
    begin
     D <= D+1;
    end

    wire [15:0]Out;
    DeMultiplexer DeMultiplexer(.CLK(D[26]), .Out(Out),.Select(SW));

    assign LED[0] = Out[0];
    assign LED[1] = Out[1];
    assign LED[2] = Out[2];
    assign LED[3] = D[26];



endmodule

これで,実行すると.確かにSelectの選択によって,outの出力が選択できた.
しかし,LEDにはOut[0]~[2]までしか指定していないのに,Select->LED の対応は

0->0
1->1
2->2
3->2
4->0
5->1
6->2
7->2
8->OFF
9以降OFF

Selectが3~7の動作がおかしい

原因

        case(Select)
            4'h0:out[0] = in;
            4'h1:out[1] = in;
            4'h2:out[2] = in;
            4'h3:out[3] = in;
            4'h4:out[4] = in;
            4'h5:out[5] = in;
            4'h6:out[6] = in;
            4'h7:out[7] = in;
            4'h8:out[8] = in;
            4'h9:out[9] = in;
            default : out = 16'h0000;
        endcase

case文でoutの1bitのみの動作を指定しているためではないか?

module DeMultiplexer(
    input CLK,
    input [3:0] Select,
    output [15:0] Out
    );

    function [15:0]out;
    input [3:0]Select;
    input in;
        case(Select)
            4'h0:begin
                out[0] = in;
                out[15:1] = 0;
                end
            4'h1:begin
                out[0] = 0;
                out[1] = in;
                out[15:2] = 0;
                end
            4'h2:begin
                out[1:0] = 0;
                out[2] = in;
                out[15:3] = 0;
                end
            4'h3:begin
                out[2:0] = 0;
                out[3] = in;
                out[15:4] = 0;
                end
            4'h4:begin
                out[3:0] = 0;
                out[4] = in;
                out[15:5] = 0;
                end
            4'h5:begin
                out[4] = 0;
                out[5] = in;
                out[15:6] = 0;
                end
            4'h6:begin
                out[5] = 0;
                out[6] = in;
                out[15:7] = 0;
                end
            4'h7:begin
                out[6] = 0;
                out[7] = in;
                out[15:8] = 0;
                end
            4'h8:begin
                out[7] = 0;
                out[8] = in;
                out[15:9] = 0;
                end
            4'h9:begin
                out[8] = 0;
                out[9] = in;
                out[15:10] = 0;
                end
            default : out = 16'h0000;
        endcase
    endfunction

    assign Out = out(Select,CLK);   

endmodule

ほかのbitもちゃんと指定したところ問題なく動作した.

しかし,もっといい書き方があると思うので,どなたか教えてください.

if文の論理積

if(a>5 and b>2)

はエラーになります.

if(a>5 && b>2)

で通ります.

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2