Verilog HDL Continuous Assignment error at : object "" on left-hand side of assignment must have a net type

このエラーは、次のようなコードを書くと出てきます。

module test(CLK, DOUT);

    input    CLK;
    output    DOUT;

    always @(posedge CLK)
        DOUT = 1'd0;

endmodule

エラーは、こんな感じ。

Error (10137): Verilog HDL Procedural Assignment error at test.v(9): object "DOUT" on left-hand side of assignment must have a variable data type

訳してみると、「左辺のオブジェクトDOUTは、変数データタイプを持たなければならない」でしょうか。ヘルプを見ていると、ネットタイプを持っていないことが良くないようです。

で、対策ですが…(間違っているかもしれませんが)

module test(CLK, DOUT);

    input    CLK;
    output    DOUT;
   
    reg DOUT;
   
    always @(posedge CLK)
        DOUT = 1'd0;

endmodule

"reg DOUT;"を入れてみました。うーん、いいのかなぁ?

Verilog HDL Conditional Statement error at : cannot match operand(s) in the condition to the corresponding edges in the enclosing event control of the always construct

Verilog初心者である私が直面したエラーと、その対策の記録です。

    always @(posedge CLK or negedge RESET) begin
        if(TEST)
            VAR <= 1'd1;
    end

こんな感じで書いた箇所で、

Error (10200): Verilog HDL Conditional Statement error at test.v(101): cannot match operand(s) in the condition to the corresponding edges in the enclosing event control of the always construct

というお叱りを受けた次第で。

で、ヘルプを見てみると、よく分からなかったのですが・・・
always文のエッジ(@の後の部分?)が複数ある場合、文中のif文の条件からQuartusはどれが同期信号で、どれが非同期のものかを判断しているようです。だから、先程のコードのようにエッジに書かれている信号がif文の条件に出てこないと、Quartusは???となるみたいで。

なので、こうしてみました。

    always @(posedge CLK or negedge RESET) begin
        if(~RESET)
            VAR <= 1'd0;
        if(TEST)
            VAR <= 1'd1;
    end

とりあえず、これでうまく行ったのでいいかなと。詳細は詳しい人に聞いてみようと思っていますが。

2019年10月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
無料ブログはココログ