不仅使用常规的综合前(行为)仿真验证 Verilog 设计,而且还使用综合后仿真来验证 Verilog 设计是一种很好的设计实践。在调试仿真和硬件之间的不匹配时,这实际上是强制性的。如何使用 iCE40 FPGA 的开源 IceStorm 流程来实现这一点?
1 回答
有关示例,请参见https://github.com/cliffordwolf/icestorm/tree/master/examples/icestick 。“rs232demo”项目带有一个测试台,Makefile 包含用于综合前和综合后仿真的规则:
make rs232demo_tb.vcd # pre-synthesis simulation
make rs232demo_syntb.vcd # post-synthesis simulation
使用 gtkwave 之类的 VCD 查看器来查看这两个命令生成的 VCD 文件。
为了运行综合后仿真,必须首先将 BLIF 网表(综合输出)转换为 Verilog 网表:yosys -p 'read_blif -wideports example.blif; write_verilog example_syn.v'
该网表将实例化 iCE40 器件原语。Yosys 为这些原语提供了仿真模型。运行命令yosys-config --datdir/ice40/cells_sim.v
以打印该模拟库的完整路径名。编译仿真时使用此 Verilog 文件。
编辑:关于综合后模拟的另外两个常见问题解答:
(1) 时钟不应在时间戳 0 处具有时钟边沿,因为这会导致时钟寄存器更新和寄存器初始化之间的竞争条件。即以下用于生成时钟的测试台代码是有问题的:
reg clk = 1;
always #5 clk = ~clk;
相反,您应该使用类似以下的内容,在初始期间未定义时钟信号:
reg clk;
always #5 clk = (clk === 1'b0);
(2) 一些信号(或向量的单个位)可以在合成过程中被优化掉。该位可以设置为常数值(通常为x
)或由工具保持浮动。在尝试检查综合后仿真结果时,这可能会令人困惑。keep
在您希望工具保留的网络上设置属性:
(* keep *) reg [31:0] foobar;