前端学习 10-3 :验证中的SV
1、 rand bit
rand bit [2:0] val1; 声明了一个3位宽 的随机变量 val0
,其取值范围为 0
到 7
(因为 3'b111 = 7
)
bit 为2值结构,只可以表示0 和1.
rand
关键字,表示 val0
是一个 随机变量,在调用 randomize()
方法时会自动赋随机值。
2、real
real
:
SystemVerilog 中的 双精度浮点数数据类型(类似 C 中的 double
),用于表示带小数点的数值
real apb_exp;
3、realtime
realtime time_start, time_end, act_clk;
real error_ratio = 0.05; // 允许的误差范围(5%)
realtime
:SystemVerilog 的高精度时间类型(类似 real
,但专用于时间计算)。
error_ratio
:定义允许的频率误差(±5%)。
4、时钟周期计算
时钟频率 (f) = 1 / 时钟周期 (T)
时钟频率 (f):单位通常是 赫兹 (Hz),常用单位还有 kHz、MHz 或 GHz(1 GHz = 1000 MHz = 1,000,000 kHz = 1,000,000,000 Hz)。
时钟周期 (T):单位通常是 秒 (s),常用单位还有毫秒 (ms)、微秒 (μs) 或纳秒 (ns)(1 s = 1000 ms = 1,000,000 μs = 1,000,000,000 ns)。
计算示例:
假设某CPU的时钟周期为 0.5纳秒 (0.5 ns),求其时钟频率。
1.转换单位:1 ns = 10⁻⁹ s,所以 0.5 ns = 0.5 × 10⁻⁹ s = 5 × 10⁻¹⁰ s。
2.代入公式:f = 1 / T = 1 / (5 × 10⁻¹⁰) = 2 × 10⁹ Hz。
3.转换单位:2 × 10⁹ Hz = 2000,000,000 Hz = 2000 MHz 。
f = 1/(a*10⁻⁹ ns) [Hz]= 1/(a*10⁻⁹ ns)/ [MHz] =
/ a [MHz]
5、fork
fork
是一个 并行执行控制结构,用于启动多个并发线程(concurrent threads)。
语法:
fork
begin ... end // 线程1
begin ... end // 线程2
// ...
join // join_any / join_none
它通常与 join
、join_any
或 join_none
结合使用,以控制线程的同步行为.
fork ... join
(全等待),所有线程并行执行,主线程阻塞,直到 所有子线程完成。
fork ... join_any
(任一等待),主线程在任一子线程完成后继续,其余线程继续在后台运行。
fork ... join_none
(不等待),主线程立即继续 ,所有子线程在后台并行执行。
disable fork; 立即终止当前作用域内所有通过 fork
启动的并发线程。它通常用于异常处理、超时控制或资源清理场景
6、force
在 SystemVerilog(SV) 中,force
是一种 强制赋值 机制,用于在仿真过程中 临时覆盖 信号或变量的值,无论其原始驱动源(如模块输出、寄存器赋值等)如何。它通常用于调试、错误注入或特定测试场景。
语法:
force <信号或变量> = <值>; // 强制赋值
release <信号或变量>; // 释放强制,恢复原始驱动
7、 phase.phase_done
phase.phase_done.set_drain_time(this, (100));
phase_done
是 UVM 相位(Phase) 的内置成员事件,用于通知该相位的完成状态。
set_drain_time
通常在phase 的启动或执行阶段中调用,设置当前 phase
的 排水时间 比如 100
时间单位( ns)。表示在phase 正式结束后,UVM 会等待 drain time
再进入下一个phase。
作用:确保所有未完成的事务(如未响应的 DUT 操作)在相位切换前完成,可以避免资源竞争或数据丢失(如正在传输的数据包被截断)。
8、repeat
begin
repeat(time_limit*500) // 等待 time_limit*500 个时间,
env_cfg.tb_assist_vif.posedge_cpu_clk_root();
`uvm_fatal(get_type_name(), $sformatf("wait for c time-out!")); // 收不到则报告 超时
end