我的项目最终编译没有错误,但警告是“饥饿和无数”#34;。例如,我有这一行:
i_temp_reg <= {{SPI_WIDTH{'b0}}, i_temp_reg[BANK_DATA_WIDTH-1:SPI_WIDTH]};
我将参数定义为:
parameter SPI_WIDTH = 8;
parameter BANK_DATA_WIDTH = 32;
i_temp_reg是一个寄存器,正如名称所暗示的那样。我有几个这样的语句(相同的格式,不同的寄存器),所有这些都得到错误:
Concatenation with unsized literal; will interpret as 32 bits
但我认为我已经明确指出了这个文字的大小(&#39; b0)。那么,Verilog发生了什么?我必须在这里说我正常使用VHDL,而且我对它很满意,这种疯狂的语言让我有些疯狂。我弄乱了这个文字的大小吗?
其次,和那种相关,我得到了另一个问题。以下是相关陈述和警告:
output [BANK_SIZE-1:0] wAddr;
reg [BANK_SIZE-1:0] i_wAddr;
assign w_Addr = i_wAddr;
Warning: Result of 4-bit expression is truncated to fit in 1-bit target.
如果有人可以帮我识别我确实做错了什么,我真的很感激。
答案 0 :(得分:5)
'b0
确实是数字零的未分级文字,以二进制形式指定。如果你想指定宽度,它应该在文字的前面。
1'b0 // single bit 0
1'b1 // single bit 1
4'b1001 // 4 bits, value = 9
在生成警告的代码中:
{SPI_WIDTH{'b0}}
此处使用的语法是复制运算符,其中SPI_WIDTH
是复制'b0
的次数。复制是连接的一种特殊情况,因为'b0
是一个未经过大小写的文字,所以会收到警告。
如果要复制单个位SPI_WIDTH
次,产生SPI_WIDTH
位的向量,则需要将内部值调整为单个位,正如Greg在注释中指出的那样。
{SPI_WIDTH{1'b0}}
答案 1 :(得分:0)
尝试使用移位寄存器替换代码:
i_temp_reg <= i_temp_reg >> SPI_WIDTH;
这更直观,更具可扩展性。