在 System Verilog 中检测时标

Detect timescale in System Verilog

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

#(cfg_delay_i * 1fs );//will wait only if timescale is 1ps/1fs
do_something(); 

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

if(timeprecision == 1fs )#(cfg_delay_i * 1fs ) ; 
else if(timeprecision == 1ps )#(cfg_delay_i/1000 * 1ps ) ;

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

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

#(cfg_delay_i/1000.0 * 1ps)

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

#(cfg_delay_i/1.e6 * 1ns)

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

请注意,用户设置 cfg_delay 必须同样小心,以确保其值设置正确 scaling/precision。