当我使用QuestaSim在VHDL和Verilog模式下模拟Cocotb的Endian Swapper示例时,我得到了不同的时钟周期。对于provided example code中的两种模式,时钟以相同的方式生成:
@cocotb.coroutine
def clock_gen(signal):
while True:
signal <= 0
yield Timer(5000)
signal <= 1
yield Timer(5000)
@cocotb.coroutine
def run_test(dut): # stripped un
cocotb.fork(clock_gen(dut.clk))
在Verilog模式下运行:
make SIM=questa GUI=1
时钟周期为1000 ns( 1 千纳秒),因此时间分辨率为100 ps。
在VHDL模式下运行时使用:
make SIM=questa GUI=1 TOPLEVEL_LANG=vhdl
时钟周期为10000 ns( 10 千纳秒),因此时间分辨率为1 ns。
我在其他两个VHDL项目中使用相同的时钟生成。在一个我也得到10000 ns的时钟周期,(1 ns分辨率)。但在另一个中,时钟周期仅为10 ns,分辨率为1 ps。
为什么所有这些运行模式和项目的时间分辨率都不同?
如何一致地指定时间分辨率?
答案 0 :(得分:2)
没有为Makefile生成的vsim
文件中的runsim.do
命令指定时间分辨率。因此,模拟器的默认时间分辨率按照modelsim.ini
中的规定使用。其中一个VHDL项目有一个私有modelsim.ini
,其时间分辨率设置为1 ps(Resolution = ps
),而不是默认的1 ns(Resolution = ns
)。
可以通过Cocotb构建系统的Makefile变量vsim
指定其他VSIM_ARGS
个参数。但是在命令行上使用以下命令设置此变量:
make SIM=questa GUI=1 "VSIM_ARGS=-t 1ps"
不能按预期工作,因为现在已经删除了其他必需的vsim
参数。
必须在项目特定的Makefile中设置此变量,例如,在包含系统范围的Makefile之前:
VSIM_ARGS=-t 1ps
include $(COCOTB)/makefiles/Makefile.inc
include $(COCOTB)/makefiles/Makefile.sim
通过这种方式,可以在VHDL和Verilog之间获得一致的时间分辨率。必须相应地为每个项目设置参数。