0

Quartus でコンパイルし、ModelSim でいくつかのモジュールをシミュレートしてみます。

これを参照してください:

module somemodule(
   ... inputs, outputs, etc...
);
localparam BUFFER_LEN   = 96;
localparam BUFFER_LENW  = $clog2(BUFFER_LEN);
localparam DATA_WIDTH   = 32;

logic [BUFFER_LENW-1:0] bits_remain;

always_ff @(posedge rd_clk) begin : _proc_bitsremain
    if (state == LOAD) begin
        case (somevalue)
                  1: bits_remain <= DATA_WIDTH * 1;
                  2: bits_remain <= DATA_WIDTH * 2;
            default: bits_remain <= BUFFER_LEN;
        endcase
    end
    else
        bits_remain <= bits_remain - 1;
end
endmodule

ということで、modelsimでコンパイル。エラーも警告もありません。シミュレーションは成功です。すべてが順調です。次に、Quartus でコンパイル (合成) すると、次の警告が表示されます。

Warning (10230): Verilog HDL assignment warning at <location>: 
truncated value with size 32 to match size of target (7)

したがって、警告を理解し、サイズキャストで修正します。

module somemodule(
   ... inputs, outputs, etc...
);
localparam BUFFER_LEN   = 96;
localparam BUFFER_LENW  = $clog2(BUFFER_LEN);

logic [BUFFER_LENW-1:0] bits_remain;

always_ff @(posedge rd_clk) begin : _proc_bitsremain
    if (state == LOAD) begin
        case (somevalue)
                  1: bits_remain <= BUFFER_LENW'(DATA_WIDTH * 1);
                  2: bits_remain <= BUFFER_LENW'(DATA_WIDTH * 2);
            default: bits_remain <= BUFFER_LENW'(BUFFER_LEN);
        endcase
    end
    else
        bits_remain <= BUFFER_LENW'(bits_remain - 1);
end
endmodule

Quartus でのコンパイルは成功です。しかし、ModelSim でこのコードを再度コンパイルしようとすると、エラーが発生します。

** Error: <location>(148): near "'": syntax error, unexpected '\'', expecting ';'

どこが間違っていて、modelSim がサイズ キャストをコンパイルできないのはなぜですか?

4

3 に答える 3

0

BUFFER_LENW'(DATA_WIDTH * 1)現在の SystemVerilog 標準では、構文の正当性に疑問があります。LRM は、 の前に現れる正の 10 進数のみに言及し、'それ以外はすべて型として解釈されます。ただし、ここで行ったように、多くのツールで整数パラメーターを使用できるようになりました。ModelSim 10.3 以降のリリースでは、LRM に対するこの拡張がサポートされるようになりました。

これを SystemVerilog に書き込むには、現在 2 つの有効な方法があります。1 つは、連結の部分選択です。

bits_remain <= {DATA_WIDTH * 2}[BUFFER_LENW-1:0];

もう 1 つの方法は、typedef とビットストリーム キャストを使用することです。

typedef logic [BUFFER_LENW-1:0] buffer_width_t;
buffer_width_t bits_remain;


bits_remain = buffer_width_t'(DATA_WIDTH * 2);
于 2014-12-12T01:37:05.473 に答える