在 System Verilog 中检测时间刻度

Sre*_* TJ 6 modelsim system-verilog uvm system-verilog-dpi

如何从源代码中检测模拟中使用的时间刻度精度?考虑我有一个配置参数(cfg_delay_i),由用户以时间单位给出的一些延迟值作为fs。如果用户给出1000,我的代码在进一步执行之前必须等待1000fs 或 1ps

#(cfg_delay_i * 1fs );//will wait only if timescale is 1ps/1fs
do_something(); 
Run Code Online (Sandbox Code Playgroud)

如果时间刻度精度为1fs,则不会有任何问题,但如果精度高于该精度,则不会等待,它将作为0 delay工作。所以我想编写一个代码来确定用户使用的时间刻度并相应地给出延迟。我预期的伪代码如下所示,

if(timeprecision == 1fs )#(cfg_delay_i * 1fs ) ; 
else if(timeprecision == 1ps )#(cfg_delay_i/1000 * 1ps ) ;
Run Code Online (Sandbox Code Playgroud)

请帮助我确定内部时间刻度单位和精度的逻辑。

dav*_*_59 6

你可以写if (int'(1fs)!=0) // the time precision is 1fs等等。但是没有必要这样做。

#(cfg_delay_i/1000.0 * 1ps)
Run Code Online (Sandbox Code Playgroud)

无论精度是 1ps 还是更小,以上都有效。请注意使用真实文字1000.0来保持除法真实。1ps 已经是实数,所以整个表达式的结果都是实数。你也可以这样做

#(cfg_delay_i/1.e6 * 1ns)
Run Code Online (Sandbox Code Playgroud)

如果此代码所在点的时间精度大于 1fs,则结果将四舍五入到最接近的精度单位。例如,如果cfg_delay是 500 并且当前精度是 1ps,这将被四舍五入为#1ps

请注意,用户设置cfg_delay必须采取同样的措施,以确保使用正确的缩放/精度设置它们的值。