调试的时候姑且做了一个调试笔记, 稍微列一些回忆中的坑吧.


安装ModelSim的时候一定要保证和Quartus版本号一致


由Verilog中产生的 "bug"

Verilog中的initial模块在下载到开发板上时并不会生效.

所谓的"初始化"仅仅在模拟中生效.

所以严格来说还是要加一个信号来对寄存器进行初始化.

Verilog 在Quartus中编译时一定要看其中的警告信息, 因为verilog允许了隐式声明一个wire

例如我有一个module abab(input[3:0] a);

在调用时直接写了 abab xxx(b); 隐式产生了一个wire b, 但是这个隐式产生的信号b只有一个bit长, 并不是4bit长的.

同样的使用assign 隐式来定义一个wire 也会产生如上的 "bug".

Verilog 中对于输入的长度没有做到严格的匹配, 比如上文中的

module abab(input[3:0] a);

我也可以, 这样传参

wire [100:0] b;

abab xxx(b);

这样虽然可以过编译, 但是在RTL模拟中会出现一些奇怪的bug 比如输出为"z".

还有是Verilog中同时检测两个信号的always, 不过这里我也不知道正统的方法是什么, 为了保证正确.

最好采取如下写法

always @(posedge clk or negedge rst) begin
    if(!rst) begin
        ...
    end else begin
        ..
    end
end

由Quartus产生的"bug"

Quartus中的仿真功能不能看到仿真后的内存情况.

可以通过采取使用Quartus生成测试文件, 通过modelsim进行模拟仿真的方式.

这个方式需要自己写testbench文件.

仿真的步骤可以查看这个视频

期间可能遭遇无法正确加载RAM&ROM 初始化文件的情况, 可以查看这个链接

Quartus编译过程中包含了许多在仿真过程中可能用不到的工序.

对于RTL模拟(功能模拟)来说, 并不需要在Quartus中重新编译, 只需要关掉ModelSim 重新进行仿真就可以了.

而对于时序模拟来说, 需要重新编译.

利用这些步骤可以加快debug速度, 当然最稳健的方式还是每次重新编译.

Quartus中重新编译并不会自动产生testbench文件, 需要手动按按钮来生成.


由ModelSim 产生的"bug"

你可能会发现仿真结果在时序仿真和功能仿真下结果不一样.

这种情况十分有风险, 尽可能保证两种仿真下结果一致.

但是时序仿真中无法查看ROM&RAM中的数据.

在功能仿真中可以, 具体方式可查看这个链接

同时在时序仿真的时候一定要注意时钟间隔不能太短,否则可能会导致计算结果还没稳定的时候就进行了下一步。


无了, 祝好.