UVM Top Testbench

top testbench在top_tb中包含进所有的文件,将DUT放在top_tb中(例化DUT),连接好各个端口,提供clk时钟和rst_n复位信号。最主要的是要给组件中的虚接口设置接口,一般是给driver和monitor的虚接口例化接口。初始化run_test()使其自动启动UVM仿真。用config机制配置内部变量。如例:

 1 `timescale 1ns/1ps
 2 `include "uvm_macros.svh"
 3 
 4 import uvm_pkg::*;
 5 `include "my_if.sv"
 6 `include "my_transaction.sv"
 7 `include "my_sequencer.sv"
 8 `include "my_driver.sv"
 9 `include "my_monitor.sv"
10 `include "my_agent.sv"
11 `include "my_model.sv"
12 `include "my_scoreboard.sv"
13 `include "my_sequence.sv"
14 `include "my_env.sv"
15 `include "base_test.sv"
16 
17 module top_tb;
18 
19 reg clk;
20 reg rst_n;
21 reg[7:0] rxd;
22 reg rx_dv;
23 wire[7:0] txd;
24 wire tx_en;
25 
26 my_if input_if(clk, rst_n);
27 my_if output_if(clk, rst_n);
28 
29 dut my_dut(.clk(clk),
30            .rst_n(rst_n),
31            .rxd(input_if.data),
32            .rx_dv(input_if.valid),
33            .txd(output_if.data),
34            .tx_en(output_if.valid));
35 
36 initial begin
37    clk = 0;
38    forever begin
39       #100 clk = ~clk;
40    end
41 end
42 
43 initial begin
44    rst_n = 1'b0;
45    #1000;
46    rst_n = 1'b1;
47 end
48 
49 initial begin
50    run_test("base_test");
51 end
52 
53 initial begin
54    uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.drv", "vif", input_if);
55    uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.mon", "vif", input_if);
56    uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.o_agt.mon", "vif", output_if);
57 end
58 
59 endmodule

 

参考文献:

[1] 测试平台说明. http://www.asicdv.com/uvm_scan.asp?id=39.

[2] 张强. UVM实战. 机械工业出版社. 2014.07.

 

转载于:https://www.cnblogs.com/dpc525/p/5418622.html

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用同步FIFO作为DUT的SV testbench示例: ``` module tb_sync_fifo; // 引用需要的库 import uvm_pkg::*; import my_fifo_pkg::*; import my_sync_fifo_pkg::*; // 定义测试环境 class my_env extends uvm_env; // 定义测试组件 my_tester tester; // 定义FIFO实例 my_sync_fifo fifo; // 构造函数 function new(string name, uvm_component parent); super.new(name, parent); endfunction // build_phase阶段创建测试组件和FIFO实例 virtual function void build_phase(uvm_phase phase); super.build_phase(phase); // 创建测试组件 tester = my_tester::type_id::create("tester", this); // 创建FIFO实例 fifo = new("fifo"); endfunction // connect_phase阶段将FIFO实例连接到测试组件 virtual function void connect_phase(uvm_phase phase); super.connect_phase(phase); // 将FIFO实例连接到测试组件 tester.fifo = fifo; endfunction endclass // 定义测试组件 class my_tester extends uvm_component; // 定义FIFO实例 my_sync_fifo fifo; // 构造函数 function new(string name, uvm_component parent); super.new(name, parent); endfunction // run_phase阶段进行测试 task run_phase(uvm_phase phase); // 定义测试向量 bit [31:0] data_in; bit [31:0] data_out; // 写入数据到FIFO for (int i = 0; i < 10; i++) begin data_in = $random; fifo.write(data_in); `uvm_info(get_type_name(), $sformatf("Write data %0d: %h", i, data_in), UVM_LOW); end // 读取数据从FIFO for (int i = 0; i < 10; i++) begin fifo.read(data_out); `uvm_info(get_type_name(), $sformatf("Read data %0d: %h", i, data_out), UVM_LOW); end endtask endclass // 创建测试环境 my_env env; // 定义顶层模块 module top; // 创建时钟和复位信号 bit clk; bit rst; // 创建tb和DUT实例 tb_sync_fifo tb; my_sync_fifo dut(clk, rst); // 在 initial 块中初始化和开始测试 initial begin // 初始化信号 clk = 0; rst = 1; #10 rst = 0; // 开始测试 run_test(); end // 时钟生成器 always #5 clk = ~clk; endmodule // 开始测试 function void run_test(); uvm_config_db#(virtual my_env)::set(null, "*", "uvm_test_top.env", env); run_test("my_test"); endfunction endmodule ``` 在这个例子中,我们创建了一个名为 `my_env` 的测试环境,其中包含一个名为 `my_tester` 的测试组件和一个名为 `my_sync_fifo` 的FIFO实例。在 `my_tester` 组件中,我们定义了测试向量并通过 `fifo.write()` 和 `fifo.read()` 函数进行测试。在顶层模块中,我们创建了时钟、复位信号、testbench和FIFO实例,并在 initial 块中初始化和开始测试。最后,我们使用 `run_test()` 函数开始测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值