我是verilog的新手.我正在编写10x16 Round-Shift寄存器的代码.你可以帮我解决这个错误吗?如果可以做任何优化吗?
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
Run Code Online (Sandbox Code Playgroud)
该程序在输出行显示2个错误:
word_out[15:0] = word[15:0];
参考错误:
错误 - [IBLHS-NONREG]非法行为左侧a.sv,42
非reg类型在此分配的左侧无效
违规表达式为:word_out [15:0]
源信息:word_out [15:0 ] =字[15:0];
任何程序转让声明的LHS必须是类型.程序赋值语句赋值,,,或变量,不能赋值.请注意,根据某些触发事件,可以保存或存储某些值,而不能存储任何值.regregintegerrealtimewireregwire
请word_out为reg如下:
module shift_reg_v(
output reg [15:0] word_out
);
Run Code Online (Sandbox Code Playgroud)
参考警告:
警告 - [PALF]潜在的循环总是找到a.sv,24
这个始终块没有事件控制或延迟语句,它可能会导致模拟中的无限循环.
此外,您还没有对always块执行给出任何敏感性.这可能会导致无限循环.有没有触发控制为always块.此后,该块将无限执行.
在组合逻辑中使用always @(*)(或always_comb在SystemVerilog中)自动灵敏度列表.
作为旁注,您可能有一个clk,作为模块的时钟输入,并使always块工作在时钟的边缘.这将有助于建模顺序逻辑.(注意在<=顺序逻辑的情况下使用非阻塞分配).
请参阅此PDF以了解reg和nets之间的区别.此外,这个始终阻止可能很有用.
| 归档时间: |
|
| 查看次数: |
3767 次 |
| 最近记录: |