在class中可以像在verilog中一样,直接在class中引用层次化信号。示例如下:
1.DUT模块,文件名为top.v。
- module top
- (
- input clk ,
- input rst_n ,
- //总线信号
- input wr_n ,
- input rd_n ,
- input cs0_n ,
- input cs7_n );
2.cpu类,文件名为cpu.sv,在cpu类中可以通过.运算符直接引用其他模块的信号,如tb.top_inst.syn_rst_n。这么做的缺点就是,降低了类的封装性,增加了与其他模块的耦合性。
- `include "tb_interface.sv"
-
- class cpu;
-
- virtual top_if cpu_if;//声明虚拟接口
-
- function new(virtual top_if watch_dog_interface);//在构造函数中将虚拟接口传递到类变量中
- cpu_if=watch_dog_interface;
-
- endfunction
-
- task signal_synchronous(logic [2:0] signal);
- wait( tb.top_inst.syn_rst_n);//在类中直接引用其他模块的信号、变量
-
- @(posedge tb.top_inst.sys_clk);
- #1 ;
- cpu_if.cs0_n<=signal[0];//通过接口对接口中的信号赋值
- cpu_if.rd_n<=signal[1];
- cpu_if.wr_n<=signal[2];
-
- @(posedge tb.top_inst.sys_clk);
- #1 ;
- cpu_if.cs0_n<=signal[0];
- cpu_if.rd_n<=signal[1];
- cpu_if.wr_n<=signal[2];
-
- @(posedge tb.top_inst.sys_clk);
- #1 ;
- cpu_if.cs0_n<=signal[0];
- cpu_if.rd_n<=signal[1];
- cpu_if.wr_n<=signal[2];
-
- repeat(10) @(posedge tb.top_inst.sys_clk);
-
- endtask
- endclass
3.创建接口,文件名为tb_interface.sv。
- interface top_if( input bit clk );
-
- // logic clk ;
- logic rst_n ;
- //总线信号
- logic wr_n ;
- logic rd_n ;
- logic cs0_n ;
- logic cs7_n ;
- logic [15 : 0] bus_addr_in ;
- endinterface
4.在testbench中将dut和tb连接,并在tb模块中实例化类对象。
- `timescale 1ns/1ps
-
- `include "tb_interface.sv" //将接口模块包含进来
- `include "watch_dog.sv"
- `include "cpu.sv" //将cpu类模块包含进来
-
- module tb;
-
- bit clk ;
-
- top_if topif(clk); //实例化top_if对象,将clk传递给interface
- //top_if topif ;
- dszj_2k_6001797_top top_inst( .clk(topif.clk), //将topif接口对象与DUT绑定,这里直接按照位置绑定
- .rst_n( topif.rst_n ),
- .wr_n(topif.wr_n),
- .rd_n( topif.rd_n ),
- .cs0_n( topif.cs0_n ),
- .cs7_n(topif.cs7_n )
-
- );
-
- initial
- begin
- clk=0;
- topif.rst_n=0;
- #100 topif.rst_n=1; //在tb模块中可以直接通过.运算符直接操作接口信号
-
- end
-
- always #12.5 clk=~clk;
-
- watch_dog watch_dog_inst=new(topif);//将topif接口传递给watch_dog类的对象
-
- cpu cpu_inst=new(topif);//将topif接口传递给cpu类的对象
- initial
- begin
-
- repeat(1000) @(posedge clk);
- watch_dog_inst.print();
- // watch_dog_inst.
- cpu_inst.signal_synchronous(3'b111);
- end
-
- endmodule