我将尝试在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中编译它。我有0个错误和0个警告。模拟成功了,一切都很好。接下来,我在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不能编译一个尺寸的造型?
发布于 2014-12-11 22:14:57
在IEEE 1800-2012 &IEEE1800-2009中的第6.24节中介绍了该造型。IEEE1800是SystemVerilog标准。我在任何Verilog标准中都没有看到它被覆盖(如果你可以给我指出IEEE 1364-1995,2001或2005中的部分,请留下评论)。
强制使用system verilog编译器可能会解决此问题,通常是通过将文件扩展名更改为“.sv”或在命令行中添加-sv标志来实现的。
这些标准并没有规定哪些部分仅用于模拟,哪些部分是可合成的,因此您可能会遇到可以模拟但不能合成的问题。如果我正确地理解了问题,那么在那一分钟,情况正好相反。这可能只是对SystemVerilog的支持程度不同而已。
但是,您可以使用temp变量进行强制转换,或者使用temp变量来捕获额外的部分,这些部分永远不会被使用并被优化。
reg [W-1:0] temp_two;
always @* begin
temp_two = (DATA_WIDTH * 2);
end
//...
bits_remain <= temp_two[4:0]; 或
reg [W-5:0] temp_throw_away;
{temp_throw_away, bits_remain} <= (DATA_WIDTH * 2);发布于 2014-12-12 09:37:05
在当前的SystemVerilog标准中,语法BUFFER_LENW'(DATA_WIDTH * 1)的合法性是值得怀疑的。LRM只提到出现在'之前的正十进制数,其他所有内容都被解释为一个类型。但是,许多工具现在都允许使用整数参数,就像您在这里所做的那样。LRM10.3和更高版本现在支持ModelSim的这个扩展。
目前有两种合法的方法可以在SystemVerilog中编写此代码。一种是在连接时使用part-select。
bits_remain <= {DATA_WIDTH * 2}[BUFFER_LENW-1:0];另一种方法是使用类型定义和位流转换。
typedef logic [BUFFER_LENW-1:0] buffer_width_t;
buffer_width_t bits_remain;
bits_remain = buffer_width_t'(DATA_WIDTH * 2);发布于 2020-05-22 16:21:20
要将32位无符号类型转换为8位无符号,需要从32位本地参数中选择所需的位,然后按常规方式执行所需的任何操作。
localparam MY_CONST_32_BITS = 96; // parameters always seem to be type cast to 32 bit, even if you pass 8'd96 as the value.
wire [7:0] my_const_8_bits = MY_CONST_32_BITS[7:0]; // Select lower 8 bits out of 32 bits
wire [8:0] double_my_const_9_bits = my_const_8_bits * 8'd2; // 8 bit wide unsigned decimal value 2.上面的代码在Altera Quartus工具中编译得很好。
https://stackoverflow.com/questions/27424450
复制相似问题