模块使用
模块定义加参数
module ctrl_5 #(parameter int addr_width=8, parameter int data_width=32)(
input [addr_width-1:0] cmd_addr_i
);
//模块例化时决定端口宽度
ctrl_5 #(.addr_width(16)) regs5_inst(...);
宏定义和模块定义
`define ADDR_WIDTH 6
`define DATA_WIDTH 32
module ctrl_regs6(
input ['ADDR_WIDTH-1:0] cmd_addr_i
)
接口使用
含参接口
interface name #(parameter int addr_width =6);
logic [addr_width-1:0] cmd_addr;
modport dut(
input cmd_addr
);
clocking cb@(posedge clk);
default input #10ns output #2ns;
input addr_width;
endclocking
covergroup cg @(posedge clk iff rstn);
addr: coverpoint addr{
bins addr = {1};
}
endcovergroup
property name;
...
endproperty;
assert property() else `uvm_error()
endinterface: name
- 建议将接口的信号的数据类型定义为logic。除非是多驱动情况,此时使用wire。如果用接口信号与DUT连接,那么应该是四值逻辑,logic/reg/wire,而不是二值逻辑byte/bit/int。
- 使用modport后,信号连接通过modport连接。
数据限定参数
- const限定ref声明的参数,可以保护数据对象只被读取而不会写入。
- static变量在仿真开始的时候被创建,可以被多个进程/方法共享,直到仿真结束被销毁
- automatic进入该进程/方法时,变量被创建,离开该进程和方法时被销毁。
在module、program、interface、task、function之外声明的变量为static类型;在module、program、interface中定义的task和function默认是static类型的;在过程块中task、function和process中定义的变量的作用域跟随它的作用域,即过程块的类型;程序块默认的生命周期类型是static。