我是第一次接触verilog。我正在编写10x16舍入移位寄存器的代码。你能帮我解决这个错误吗?还有没有什么优化可以做的?
module shift_reg_v(
output [15:0] word_out
);
integer i;
integer j;
reg [159:0] coeff;
reg [15:0] word;
initial
begin
for (i=0;i<160;i=i+1)
begin
coeff[i] = 0;
end
for (i=0;i<16;i=i+1)
begin
word[i] = 0;
end
end
always
begin
for (j=0;j < 10;j = j+1)
begin
for (i=0;i < 16;i = i+1)
begin
if (j==0)
begin
word[i] = coeff[(16*(j+1))+i];
end
else
begin
coeff[(16*j)+i] = coeff[(16*(j+1))+i];
end
end
end
coeff[159:144] = word[15:0];
word_out[15:0] = word[15:0];
end
endmodule程序在输出行显示两个错误:word_out[15:0] = word[15:0];
发布于 2016-05-11 18:51:02
关于错误:
Error-IBLHS-NONREG非法行为左手边a.sv,42岁
非reg类型在此赋值的左侧上无效
有问题的表达式是: word_out15:0
来源信息: word_out15:0 = word15:0;
任何过程赋值语句的LHS必须是reg类型。过程赋值语句为reg、integer、real或time变量赋值,但不能为wire赋值。请注意,reg可以根据某个触发事件保存或存储的一些值,而wire不能存储任何值。
将word_out设置为reg,如下所示:
module shift_reg_v(
output reg [15:0] word_out
);关于警告:
Warning-PALF电位始终循环找到a.sv,24
这个always块没有事件控制或延迟语句,它可能会在模拟中导致无限循环。
此外,您为always块执行指定了not任何敏感度。这可能会导致无限循环。对于always数据块,没有触发控制。从此以后,该块将无限执行。
将always @(*) (或SystemVerilog中的always_comb )用于组合逻辑中的自动敏感度列表。
作为旁注,您可能有一个clk,作为模块的时钟输入,并使always模块工作在时钟的边沿。这将有助于对时序逻辑进行建模。(注意在顺序逻辑的情况下非阻塞赋值<=的用法)。
有关reg和nets.Also之间的区别,请参阅this PDF,此always block可能会很有用。
发布于 2016-05-11 23:15:10
此外,您还需要更正以下代码:
coeff[i] = 0;
这是一个比特分配,应该明确指定为编码实践。
coeff[i] = 'h0;
https://stackoverflow.com/questions/37159794
复制相似问题