2

当我使用 QuestaSim 在 VHDL 和 Verilog 模式下模拟 Cocotb 的Endian Swapper示例时,我得到了不同的时钟周期。在提供的示例代码中,两种模式的时钟都以相同的方式生成:

@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(一千纳秒),因此时间分辨率为 100 ps。

在 VHDL 模式下运行时:

make SIM=questa GUI=1 TOPLEVEL_LANG=vhdl

时钟周期为10000 ns(纳秒),因此时间分辨率为1 ns。

我在其他两个 VHDL 项目中使用相同的时钟生成。在一个中,我也得到了 10000 ns 的时钟周期(1 ns 分辨率)。但在另一个中,时钟周期仅为 10 ns,分​​辨率为 1 ps。

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

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

4

2 回答 2

2

Makefile 生成的文件中没有为vsim命令指定时间分辨率。runsim.do因此,模拟器的默认时间分辨率按照modelsim.ini. 其他 VHDL 项目之一的私有modelsim.ini时间分辨率设置为 1 ps ( Resolution = ps) 而不是默认的 1 ns ( Resolution = ns)。

其他vsim参数可以由VSIM_ARGSCocotb 构建系统的 Makefile 变量指定。但是在命令行上设置这个变量:

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

于 2016-03-30T09:26:54.173 回答
1

cocotb 1.3.0 开始,您可以使用COCOTB_HDL_TIMEUNITCOCOTB_HDL_TIMEPRECISION生成文件变量以与模拟器无关的方式定义时间刻度。

于 2021-11-28T08:48:23.923 回答