Verilog:与未定型字面量串联,但是为什么呢?

Mew*_*ewa 0 verilog concat

我的项目最终编译成功,没有错误,但是警告“饥渴且数量众多”。例如,我有这行:

  i_temp_reg <= {{SPI_WIDTH{'b0}}, i_temp_reg[BANK_DATA_WIDTH-1:SPI_WIDTH]};
Run Code Online (Sandbox Code Playgroud)

我将参数定义为:

  parameter SPI_WIDTH                   = 8;
  parameter BANK_DATA_WIDTH             = 32;
Run Code Online (Sandbox Code Playgroud)

顾名思义,i_temp_reg是一个寄存器。我还有更多类似的语句(相同的格式,不同的寄存器),并且所有这些语句都会出错:

  Concatenation with unsized literal; will interpret as 32 bits
Run Code Online (Sandbox Code Playgroud)

但是我认为我已经很清楚地指定了此字面量('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.
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我准确地确定我在做什么错,我将不胜感激。

dwi*_*kle 5

'b0实际上,它是数字零的无大小文字,以二进制形式指定。如果要指定宽度,则应在文字前面加上前缀。

1'b0      // single bit 0
1'b1      // single bit 1
4'b1001   // 4 bits, value = 9
Run Code Online (Sandbox Code Playgroud)

在生成警告的代码中,您有:

{SPI_WIDTH{'b0}}
Run Code Online (Sandbox Code Playgroud)

此处使用的语法是复制运算符,其中SPI_WIDTH复制的次数'b0。复制是连接的一种特殊情况,并且由于'b0它是不定大小的文字,因此您会得到警告。

如果要复制单个位SPI_WIDTH时间,得到一个SPI_WIDTH位向量,则需要将内部值调整为单个位,正如Greg在注释中指出的那样。

{SPI_WIDTH{1'b0}}
Run Code Online (Sandbox Code Playgroud)

  • @Mewa,您需要`{SPI_WIDTH {1'b0}}`。'1'b0`,而不是''b0` (2认同)