在 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。
如何从源代码检测模拟中使用的时间尺度精度?。 考虑我有一个配置参数(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。