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 がサイズ キャストをコンパイルできないのはなぜですか?