Verilog:与未经证实的字面串联,但为什么?

时间:2014-08-15 16:29:33

标签: verilog concat

我的项目最终编译没有错误,但警告是“饥饿和无数”#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.

如果有人可以帮我识别我确实做错了什么,我真的很感激。

2 个答案:

答案 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;

这更直观,更具可扩展性。