Verilog:与未大小的文本连接,但为什么?

Verilog:与未大小的文本连接,但为什么?,verilog,concat,Verilog,Concat,我的项目最终编译成功,没有出现错误,但警告是“饥饿和无数”。例如,我有一行: i_temp_reg <= {{SPI_WIDTH{'b0}}, i_temp_reg[BANK_DATA_WIDTH-1:SPI_WIDTH]}; i_temp_reg是一个寄存器,顾名思义。我还有几个类似的语句(相同的格式,不同的寄存器),它们都有错误: Concatenation with unsized literal; will interpret as 32 bits 但我认为我已经非常清

我的项目最终编译成功,没有出现错误,但警告是“饥饿和无数”。例如,我有一行:

  i_temp_reg <= {{SPI_WIDTH{'b0}}, i_temp_reg[BANK_DATA_WIDTH-1:SPI_WIDTH]};
i_temp_reg是一个寄存器,顾名思义。我还有几个类似的语句(相同的格式,不同的寄存器),它们都有错误:

  Concatenation with unsized literal; will interpret as 32 bits
但我认为我已经非常清楚地指定了这个文本的大小(“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.

如果有人能帮我准确地找出我做错了什么,我会非常感激的。

'b0
确实是一个不加大小的数字0,用二进制指定。如果要指定宽度,则应以文字为前缀

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}}

'b0
实际上是以二进制指定的数字0的无大小文本。如果要指定宽度,则应以文字为前缀

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}}

尝试用移位寄存器替换代码:

i_temp_reg <= i_temp_reg >> SPI_WIDTH;
i_temp_reg>SPI_WIDTH;

这更加直观和可扩展。

尝试用移位寄存器替换代码:

i_temp_reg <= i_temp_reg >> SPI_WIDTH;
i_temp_reg>SPI_WIDTH;

这更直观、更可扩展。

@Mewa,您需要
{SPI_WIDTH{1'b0}}
1'b0
,而不是
'b0
@Mewa,你想要
{SPI\u WIDTH{1'b0}}
<代码>1'b0,而不是
'b0