数字集成电路设计-18-UVM

引言

UVM(Universal Verification Methodology)可以理解为形而上的东西,可以理解为是基于System verilog的一个库,提供一些API调用。

其实没必要把UVM抬的那么高,上升到形而上的层次。因为在实际的IC验证时,对某个复杂DUT的验证时,一般都会拆分成那几个模块。

要对DUT测试,肯定需要先产生测试用例,就是UVM中的sequencer和sequence概念。

产生测试用例之后,肯定需要把测试用例送到DUT端口上,作为激励,就是UVM中的driver的概念。

既然是验证,就是比较DUT是不是对的,既然要比较对与错,就需要DUT的行为模型,就是UVM中的reference model的概念。

既然要对比,可能对比算法比较复杂,一般需要单独出来,就是UVM中scoreboard的概念。

有了DUT的行为模型,要给行为模型激励啊,怎么给呢?直接采集DUT的端口信息就行了,这个工作也独立出来,就是UVM中monitor的概念。

monitor(软件部分)怎么采集DUT(RTL部分)的端口信息呢?用PLI,VPI,DPI,都可以。UVM将这个内容封装了一下,就是uvm_config_db。

这么多拆开独立的部分,他们之间肯定需要通信啊,怎么办呢?用消息队列,有名管道,socket等进行间通信方式都可以,UVM又封装了一下,美其名曰TLM。


从上面可以看出,UVM带给我们的不是形而上的高达上概念(当然,如果你之前在验证时,没有自觉的将不同功能模块分开的话,可能会感觉UVM很高达上,哈哈),而是实实在在的代码,提供了一组API,使我们在做verification时少敲了几行代码。用UVM也有不好的地方,个人感觉运行效率有点低,仿真时间加长。

总之,UVM是无数验证工程师经验的结晶,仿真工具也都支持,所以在做IC验证时尽量用UVM中的API,也可以自己实现TLM,config机制,实现起来也很简单(我实现过)。


之前我们熟悉了一下SVUNIT(http://blog.csdn.net/rill_zhen/article/details/45342999),本小节我们通过一个实验来熟悉一下UVM。

仔细体会本实验中的代码,领会其背后含义之后,UVM就入门了。


1,DUT

要进行验证,必须要有个靶子,就是DUT。本例DUT很简单:“左耳进,右耳出”,吃什么吐什么。


/*
* uvm test example
* Rill 2015-05-02
*/

 module Mdut
 #
 (
 parameter DATA_L = 8
 )
 (
	input clk,
	input rst_n,
	
	IFrx.S 			rx_if,
	output 			tx_dv,
	output [DATA_L-1:0]	txd
 );
 
	logic 			tx_dv_r;
	logic [DATA_L-1:0] 	txd_r;
 
	always_ff @(posedge clk)
		if(~rst_n)
			begin
				tx_dv_r <= 1'b0;
				txd_r <= DATA_L'b0;
			end
		else if(rx_if.vld)
			begin
				tx_dv_r <= rx_if.vld;
				txd_r <= rx_if.data;
			end
			
	assign tx_dv = tx_dv_r;
	assign txd = txd_r;
 
 endmodule //Mdut
 

interface:

/*
* uvm test example
* Rill 2015-05-02
*/

 interface IFrx
 #(
 parameter DATA_L=8
 )
 ();
 
 logic vld;
 logic [DATA_L-1:0] data;
 
 modport M
 (
	output vld,
	output data
);

 modport S
 (
	input vld,
	input data
);
 endinterface:IFrx



2,UVM部分

有了DUT,用UVM那一套东西怎么对DUT进行测试呢?

根据引言中的分析,UVM中的概念不是凭空产生的,一定要搞明白为什么会出现那个概念,是什么需求促使了那个概念的产生。

此外,下面我将直接将代码清单列出,要仔细体会,每一行代码的作用,为什么那么写,换个写法行不行。要做UVM的主人,千万不要被UVM的那些概念牵着鼻子走,否则会很被动。要理解TLM,config机制对RTL design人员可能会有点难度,可以请教公司的软件人员。UVM用多了之后,会发现那些概念都是水到渠成事。


2.1 测试用例,transaction.sv


/*
* uvm test example
* Rill 2015-05-02
*/
 `ifndef MY_TRANSACTION_SV
 `define MY_TRANSACTION_SV
 
 import uvm_pkg::*;
 `define DATA_MAX 255
 
 typedef struct packed
 {
	logic vld;
	logic [7:0] data;
 }trans_t;
 
 
 class my_transaction extends uvm_sequence_item;
 
	`uvm_object_utils(my_transaction)
	rand bit vld;
	rand bit [7:0] data;
	
	constraint c_trans0
	{
		vld dist
		{
			0 :/ 50,
			1 :/ 50
		};
		
		data dist
		{
			0 				:/ 0,
			[1:100] 		:/ 50,
			[101:`DATA_MAX]	:/ 50
		};
	}
	
	constraint c_trans1
	{
		data >= 5;
	}
	
	extern function new(string name = "my_transaction");
	extern function trans_t gen_tr;
	
 endcla
  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值