我需要根据计数器将输入引脚的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
答案 0 :(得分:2)
关于您的错误:您应该使用+:
语法[4 * cnt +:4]
有关更多信息,请参见here。
即使如果在语义上允许您输入的值也将是错误的:
[4*cnt-1:4*cnt]
会给出从低到高的索引,例如如果cnt = 1则得到[3:4]
[4*cnt-1:4*cnt]
的[31:0]范围,则 reg
给出负索引。
您可能打算使用[4*cnt+3:4*cnt]
但是您还有其他错误。
首先,对变量使用关键字非常危险。 (reg)
第二,您正在使用非时钟信号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