• SystemVerilog语法中,在Class中引用层次化信号


    在class中可以像在verilog中一样,直接在class中引用层次化信号。示例如下:
    1.DUT模块,文件名为top.v。

    1. module top
    2. (
    3. input clk ,
    4. input rst_n ,
    5. //总线信号
    6. input wr_n ,
    7. input rd_n ,
    8. input cs0_n ,
    9. input cs7_n );

    2.cpu类,文件名为cpu.sv,在cpu类中可以通过.运算符直接引用其他模块的信号,如tb.top_inst.syn_rst_n。这么做的缺点就是,降低了类的封装性,增加了与其他模块的耦合性。

    1. `include "tb_interface.sv"
    2. class cpu;
    3. virtual top_if cpu_if;//声明虚拟接口
    4. function new(virtual top_if watch_dog_interface);//在构造函数中将虚拟接口传递到类变量中
    5. cpu_if=watch_dog_interface;
    6. endfunction
    7. task signal_synchronous(logic [2:0] signal);
    8. wait( tb.top_inst.syn_rst_n);//在类中直接引用其他模块的信号、变量
    9. @(posedge tb.top_inst.sys_clk);
    10. #1 ;
    11. cpu_if.cs0_n<=signal[0];//通过接口对接口中的信号赋值
    12. cpu_if.rd_n<=signal[1];
    13. cpu_if.wr_n<=signal[2];
    14. @(posedge tb.top_inst.sys_clk);
    15. #1 ;
    16. cpu_if.cs0_n<=signal[0];
    17. cpu_if.rd_n<=signal[1];
    18. cpu_if.wr_n<=signal[2];
    19. @(posedge tb.top_inst.sys_clk);
    20. #1 ;
    21. cpu_if.cs0_n<=signal[0];
    22. cpu_if.rd_n<=signal[1];
    23. cpu_if.wr_n<=signal[2];
    24. repeat(10) @(posedge tb.top_inst.sys_clk);
    25. endtask
    26. endclass

    3.创建接口,文件名为tb_interface.sv。

    1. interface top_if( input bit clk );
    2. // logic clk ;
    3. logic rst_n ;
    4. //总线信号
    5. logic wr_n ;
    6. logic rd_n ;
    7. logic cs0_n ;
    8. logic cs7_n ;
    9. logic [15 : 0] bus_addr_in ;
    10. endinterface

    4.在testbench中将dut和tb连接,并在tb模块中实例化类对象。

    1. `timescale 1ns/1ps
    2. `include "tb_interface.sv" //将接口模块包含进来
    3. `include "watch_dog.sv"
    4. `include "cpu.sv" //将cpu类模块包含进来
    5. module tb;
    6. bit clk ;
    7. top_if topif(clk); //实例化top_if对象,将clk传递给interface
    8. //top_if topif ;
    9. dszj_2k_6001797_top top_inst( .clk(topif.clk), //将topif接口对象与DUT绑定,这里直接按照位置绑定
    10. .rst_n( topif.rst_n ),
    11. .wr_n(topif.wr_n),
    12. .rd_n( topif.rd_n ),
    13. .cs0_n( topif.cs0_n ),
    14. .cs7_n(topif.cs7_n )
    15. );
    16. initial
    17. begin
    18. clk=0;
    19. topif.rst_n=0;
    20. #100 topif.rst_n=1; //在tb模块中可以直接通过.运算符直接操作接口信号
    21. end
    22. always #12.5 clk=~clk;
    23. watch_dog watch_dog_inst=new(topif);//将topif接口传递给watch_dog类的对象
    24. cpu cpu_inst=new(topif);//将topif接口传递给cpu类的对象
    25. initial
    26. begin
    27. repeat(1000) @(posedge clk);
    28. watch_dog_inst.print();
    29. // watch_dog_inst.
    30. cpu_inst.signal_synchronous(3'b111);
    31. end
    32. endmodule


     

  • 相关阅读:
    数据库事务到底是什么?
    HIVE无法启动问题
    CnosDB 签约京清能源,助力分布式光伏发电解决监测系统难题。
    Lumiprobe 自由基分析丨H2DCFDA说明书
    使用Locust进行接口性能测试:安装、命令参数解析与示例解读
    正点原子嵌入式linux驱动开发——Linux INPUT子系统
    Minecraft 的元宇宙进化 ?MineDojo 实现操作角色探索程序生成的 3D 世界
    IMX6ULL学习笔记(3)——挂载NFS网络文件系统
    [附源码]计算机毕业设计springboot汽配管理系统
    CocosCreator3.8研究笔记(八)CocosCreator 节点和组件的使用
  • 原文地址:https://blog.csdn.net/qq_33300585/article/details/134096840