Quartus 报错汇总(持续更新...)
1、
Error (10663): Verilog HDL Port Connection error at top_rom.v(70): output or inout port "stcp" must be connected to a structural net expression
输出变量stcp在原设计文件中已经定义为reg型,在实例化时不能再定义为reg型,而应该是wire型,不然就会报10663的错误
2、
Error (10137): Verilog HDL Procedural Assignment error at tb_rom.v(45): object "key" on left-hand side of assignment must have a variable data type
Error (10137): Verilog HDL Procedural Assignment error at tb_rom.v(45): object "key" on left-hand side of assignment must have a variable data type
原因:testbench中输入写成了wire 输出写成了reg
改正:输入 reg 型 输出 wire 型
注意,在tb去实例化的时候输入就用reg型 输出就用wire型 (谐音输入ru 所以reg都是r)
但是在一个RTL文件去实例化另一个的时候,如果子RTL文件(被实例化)的这个输入变量已经是reg型,则在顶层文件里这个输出变量就用wire就好。
3、ROM ip这个实验中模块 rom_ctrl 里为了让数码管不刷新那么快,读取数据时间隔200ms才会去读取,所以有一个200ms的计数器。但是在写200ms计数器模块时,如果按照下面这种else if 的写法就是错的
always@(posedge sys_clk or negedge sys_rest_n)
if (!sys_rest_n)
cnt_200ms <= 24'b0;
else if(cnt_200ms == CNT_MAX)
cnt_200ms <= 24'b0;
else if (addr_flag1== 1'b1 || addr_flag2 == 1'b1)
cnt_200ms <= 24'b0;
else
cnt_200ms <= cnt_200ms + 1'b1;
但是这样合在一起写就是对的
always@(posedge sys_clk or negedge sys_rest_n)
if (!sys_rest_n)
cnt_200ms <= 24'b0;
else if (cnt_200ms == CNT_MAX||addr_flag1== 1'b1 || addr_flag2 == 1'b1)
cnt_200ms <= 24'b0;
else
cnt_200ms <= cnt_200ms + 1'b1;
具体原因不明确。。。。