首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quartus和modelsim -编译大小转换

Quartus和modelsim -编译大小转换
EN

Stack Overflow用户
提问于 2014-12-11 21:51:03
回答 3查看 1.4K关注 0票数 0

我将尝试在Quartus中编译,并在ModelSim中模拟一些模块。

请看以下内容:

代码语言:javascript
复制
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中编译(合成)它,并显示以下警告:

代码语言:javascript
复制
Warning (10230): Verilog HDL assignment warning at <location>: 
truncated value with size 32 to match size of target (7)

所以,我理解了这个警告,并通过尺寸转换来修复它:

代码语言:javascript
复制
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编译这段代码,我会得到一个错误:

代码语言:javascript
复制
** Error: <location>(148): near "'": syntax error, unexpected '\'', expecting ';'

我哪里错了,为什么modelSim不能编译一个尺寸的造型?

EN

回答 3

Stack Overflow用户

发布于 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变量来捕获额外的部分,这些部分永远不会被使用并被优化。

代码语言:javascript
复制
reg [W-1:0] temp_two;
always @* begin
  temp_two = (DATA_WIDTH * 2);
end

//...
bits_remain <= temp_two[4:0]; 

代码语言:javascript
复制
reg [W-5:0] temp_throw_away;
{temp_throw_away, bits_remain} <= (DATA_WIDTH * 2);
票数 0
EN

Stack Overflow用户

发布于 2014-12-12 09:37:05

在当前的SystemVerilog标准中,语法BUFFER_LENW'(DATA_WIDTH * 1)的合法性是值得怀疑的。LRM只提到出现在'之前的正十进制数,其他所有内容都被解释为一个类型。但是,许多工具现在都允许使用整数参数,就像您在这里所做的那样。LRM10.3和更高版本现在支持ModelSim的这个扩展。

目前有两种合法的方法可以在SystemVerilog中编写此代码。一种是在连接时使用part-select。

代码语言:javascript
复制
bits_remain <= {DATA_WIDTH * 2}[BUFFER_LENW-1:0];

另一种方法是使用类型定义和位流转换。

代码语言:javascript
复制
typedef logic [BUFFER_LENW-1:0] buffer_width_t;
buffer_width_t bits_remain;


bits_remain = buffer_width_t'(DATA_WIDTH * 2);
票数 0
EN

Stack Overflow用户

发布于 2020-05-22 16:21:20

要将32位无符号类型转换为8位无符号,需要从32位本地参数中选择所需的位,然后按常规方式执行所需的任何操作。

代码语言:javascript
复制
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工具中编译得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27424450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档