1、在 UVM 中,如果需要通过 uvm_print
打印 class 中所有变量,并且希望某些变量以十进制格式显示,可以在定义和注册变量时使用 UVM_DEC
选项。具体可以通过在 uvm_field_*
宏的后面添加 UVM_DEC
来实现。
class my_class extends uvm_object; int A; `uvm_object_utils_begin(my_class) `uvm_field_int(A, UVM_ALL_ON | UVM_DEC) // 注册变量A,使用UVM_DEC来打印为十进制格式 `uvm_object_utils_end function new(string name = "my_class"); super.new(name); endfunction endclass
2、verilog 之奇异0/1/x 态
运算符 | 输入 A | 输入 B | 结果 |
---|---|---|---|
& | 0 | x | 0 |
& | 1 | x | x |
| | x | 1 | 1 |
| | x | 0 | x |
说明:
&
(与运算):0 & x
永远为0
,因为0
与任何值x
进行 "与" 运算结果都是0
。1 & x
的结果为x
,因为1
与任何值x
进行 "与" 运算,结果就是x
。
|
(或运算):1 | x
永远为1
,因为1
与任何值x
进行 "或" 运算,结果总是1
。0 | x
的结果为x
,因为0
与任何值x
进行 "或" 运算,结果就是x
。
3、如果你在 uvm_component_utils_begin
和 uvm_component_utils_end
中通过 uvm_field_int
来注册变量,并且希望在命令行中传递负数,则需要注意 uvm_field_int
本身并不支持直接接受负数的传递。
1. 注册变量
在 env
组件中使用 uvm_field_int
注册变量:
class my_env extends uvm_env; `uvm_component_utils_begin(my_env) `uvm_field_int(my_param, UVM_DEFAULT) // 注册 my_param `uvm_component_utils_end int my_param; function new(string name, uvm_component parent); super.new(name, parent); endfunction // Build phase 获取变量值 function void build_phase(uvm_phase phase); super.build_phase(phase); `uvm_info("my_env", $sformatf("my_param = %0d", my_param), UVM_LOW) endfunction endclass
2. 命令行传递负数补码
假设我们希望传递 -5
给 my_param
,计算它的 32 位补码为 4294967291
,16进制是32'hffff_fffb,在命令行中传递:
vsim -sv_seed 12345 +my_param=4294967291 or vsim -sv_seed 12345 "+my_param=32'hffff_fffb"