文章目录
记录一下《UVM实战(卷I)》学习笔记。
这节的 dut 与第一节是一样的,直接对输入打拍输出:
module dut(clk,
rst_n,
rxd,
rx_dv,
txd,
tx_en);
input clk;
input rst_n;
input[7:0] rxd;
input rx_dv;
output [7:0] txd;
output tx_en;
reg[7:0] txd;
reg tx_en;
always @(posedge clk) begin
if(!rst_n) begin
txd <= 8'b0;
tx_en <= 1'b0;
end
else begin
txd <= rxd;
tx_en <= rx_dv;
end
end
endmodule
1 加入 transaction
一般物理协议传输都是以帧或包为单位,很少以bit或byte为单位进行数据交换。
transaction 用于模拟这种实际情况,一笔 transaction 就是一个包。
注意:
- my_transaction的基类是uvm_sequence_item。只有从uvm_sequence_item派生的transaction才可以使用UVM中强大的sequence机制。
- 没有使用uvm_component_utils宏来实现factory机制,而是使用了uvm_object_utils。
书本例程 my_transaction.sv 定义了一个简单的以太网的 transaction 。
在my_driver中实现基于transaction的驱动。
my_driver中定义的 main_phase 实现 transaction 的例化,然后 drive_one_pkt 任务的作用是将这个包按 byte 传输出去。
添加相关源文件,然后定义 modelsim do文件:
cd D:/prj/uvm_prj/demo2.3.1
vlib work
set UVM_PATH C:/software/FPGA/modeltech64_10.5/verilog_src/uvm-1.1d/src
set SRC_PATH .
vlog +incdir+$UVM_PATH $UVM_PATH/uvm_pkg.sv $SRC_PATH/top_tb.sv $SRC_PATH/dut.sv
vsim -novopt -sv_lib C:/software/FPGA/modeltech64_10.5/uvm-1.1d/win64/uvm_dpi work.top_tb
add wave -position insertpoint sim:/top_tb/*
run 2us
定义批处理文件 :
vsim -do demo.do
文件列表:

仿真结果:

在 my_driver 的 main_phase 可以看到,产生了两个随机包,然后发送出去,这与仿真结果相符合。
2 加入 env
定义好了组件,验证平台的什么位置对它们进行实例化?
引入一个容器类,在这个容器类中实例化 driver、monitor、reference

本篇博客详细介绍了如何在《UVM实战(卷I)》中,通过加入transaction、env、monitor、agent、referencemodel和scoreboard,以及field_automation机制,实现DUT驱动和验证的模块化设计。重点讲解了组件的组织结构和交互流程,以及如何利用UVM的工厂机制和TLM通信。
最低0.47元/天 解锁文章
1037

被折叠的 条评论
为什么被折叠?



