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