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

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

#複数の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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/adc7ad65-1720-aba5-522b-0cb50ca2cd1a.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/b983aee5-6a45-6f70-ade8-6c090a74338a.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/08f8671b-09b1-ecea-0c1d-acb7f06cfc1d.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が３～７の動作がおかしい

###原因

```
        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)
```
で通ります．