zoukankan      html  css  js  c++  java
  • SystemVerilog Testbench学习总结(Lab1)

    1、ntb_template -t router router.v 执行该命令会生成3个文件(命令中router.v是dut)

      a、router.if.vrh,包含信号端口的方向(相对于dut)、位宽,可将此信号加上类型(logic或者bit),去掉方向,作为interface中的信号声明。将此信号去掉位宽来作为interface中clocking模块中同步信号的声明;
      b、router.test_top 此文件中会产生仿真时钟信号,接口例化等信号,仿真时钟可直接拷贝到Test Harness File使用,例化拷贝后稍加修改即可使用;

    2、interface
      a、在interface中,信号方向的指定:
        同步信号:in a clocking block
        异步信号:in a modport

      b、一个interface应包括:(below example)

     1 interface router_io(input bit clock);//interface中有同步信号,引入时钟
     2 信号声明<类型(logic或bit) + 位宽 + 信号名>
     3 logic reset_n;
     4 logic [15:0] din;
     5 ...
     6 
     7 //同步时钟模块,执行同步信号的驱动和采样
     8 clocking cb @(posedge clock)
     9 default input #1ns output #1ns //去除输入输出的抖动
    10 //信号方向(相对于dut) + 信号名
    11 output reset_n;
    12 output din;
    13 ...
    14 endclocking:cb
    15 
    16 //使用modport将interface和test program 连接起来,在modport参数列表中,应包含前面锁创建的同步信号和潜在的异步信号。
    17 //异步信号方向指定
    18 modport TB(clocking cb,output reset_n);//需要注意,reset_n既是同步信号,也是异步信号
    19 endinterface:router_io

    3、Test Program File 测试程序:

     1 program automatic test(router.TB rtr_io);//将test program 和interface相连
     2 
     3 initial begin
     4 $display("This My first SV testbench");
     5 reset();
     6 end
     7 
     8 task reset();
     9 rtr_io.reset_n = 1'b0;//异步信号,阻塞赋值
    10 rtr_io.cb.frame_n <= 1'b1;//同步信号,非阻塞赋值
    11 rtr_io.cb.valid_n <= 1'b1;//同上
    12 //阻塞赋值和非阻塞赋值是同时执行的,最后来到##2延时2个时钟周期后拉高reset_n
    13 
    14 ##2 rtr_io.cb.reset_n <= 1'b1;//reset_n拉低2个时钟周期然后拉高
    15 repeat(15) @(router.cb);
    16 endtask:reset
    17 
    18 endprogram:test

    4、Test Harness File

     1 `timescale 1ns/100ps
     2 module router_test_top;
     3 //时钟生成可使用ntb_template产生文件中的时钟
     4 parameter simulation_cycle = 100;
     5 bit SystemClock;
     6 
     7 router_io top_io(SystemClock);//例化一个接口
     8 test t(top_io);//将接口和tb连接起来
     9 router dut(//将接口和dut连接起来
    10 .reset_n    (top_io.reset_n),
    11 .clock    (top_io.clock),
    12 .din    (top_io.din),
    13 ...
    14 .frameo_n    (top_io.frameo_n)
    15 );
    16 
    17 initial begin
    18 $timeformat(-9,1,"ns",10);    //set time
    19 SystemClock = 0;
    20 forever begin
    21 #(simulation_cycle/2)
    22 SystemClock = ~SystemClock;
    23 end
    24 end
    25 
    26 endmodule

    5、compile and simulation

      vcs -sverilog -fsdb router_test_top.sv test.sv router_io.sv router.v    //执行词句会生成可执行文件simv
    
      ./simv    //执行词句可产生仿真结果,并且产生需要保存的波形文件(下面介绍);

    6、waveform dump
      第一种波形文件:

    $vcdpluson;//加入此句vcdplus.vpd文件

      第二种波形文件:

    $fsdbDumpfile("test.fsdb");//被保存的波形文件名命名
    $fsdbDumpvars(0,router_test_top);//router_test_top即代表你要保存的波形是哪个文件中的信号;


  • 相关阅读:
    Java程序语言的后门-反射机制
    JAVA设计模式-单例模式(Singleton)线程安全与效率
    JAVA设计模式-动态代理(Proxy)源码分析
    Mybatis源码解析,一步一步从浅入深(七):执行查询
    Mybatis源码解析,一步一步从浅入深(六):映射代理类的获取
    python程序中的进程操作
    进程
    操作系统的发展史
    详尽实用的 PyCharm 教程
    python的socketserver模块实现TCP/UDP并发
  • 原文地址:https://www.cnblogs.com/loves6036/p/5747754.html
Copyright © 2011-2022 走看看