我需要根据计数器从输入引脚将 4 个字节写入寄存器的不同部分,使用我现在拥有的代码出现此错误:
错误 (10734(:m.v(156( 处的 Verilog HDL 错误:cnt 不是常量
我应该如何处理?
wire wren, rst;
wire [3:0] abcd;
reg [31:0] my_reg;
reg [3:0] cnt;
always @(posedge wren or posedge rst)
begin
if (rst == 1)
begin
my_reg <= 0;
end
else
begin
if (wren == 1)
begin
my_reg [4*cnt+3:4*cnt] <= abcd;
end
end
end
至于你的错误:你应该使用+:
语法 [4*cnt +: 4]有关更多信息,请参阅此处。
即使这在语义上是允许的,你的值也是错误的:
-
[4*cnt-1:4*cnt]
会给出一个低:高索引,例如,如果 cnt=1,你会得到 [3:4] -
如果 cnt==0 [-1:0] 超出
reg
的 [31:0] 范围,则[4*cnt-1:4*cnt]
给出负索引。
您可能打算使用[4*cnt+3:4*cnt]
但是你也有其他错误。
首先,对变量使用关键字是非常危险的。(注册(
其次,您使用非时钟信号进行计时:wren
。这将创建另一个时钟树。正常过程是使用具有标准系统时钟的if
:
always @(posedge clk or posedge rst)
begin
if (rst == 1)
begin
my_reg <= 0;
end
else
begin
if (wren == 1)
begin
my_reg [4*cnt +: 4] <= abcd;
end
end
end