如何在Cocotb中指定时间分辨率?

时间:2016-03-30 09:26:54

标签: verification modelsim cocotb

当我使用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。

为什么所有这些运行模式和项目的时间分辨率都不同?

如何一致地指定时间分辨率?

1 个答案:

答案 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之间获得一致的时间分辨率。必须相应地为每个项目设置参数。