在项目上使用uvm代码自动生成可以提高验证环境搭建的效率,你可以:
使用uvm代码生成器创建基本的uvm验证环境框架,然后丢弃代码生成器模板并扩展和维护生成出来的代码。尽管uvm代码生成器仅在项目的初始阶段使用,然后被丢弃,但仍然提高了验证的效率。
团队所有成员的验证环境结构获得了统一,方便了集成和检视。
根据项目的特定需求,个性化地定制自己的uvm代码生成器模板和脚本。
示例
要运行uvm代码生成器,至少需要三个template 文件:
clkndata.tpl Interface templatefile common.tpl Commontemplatefile pinlist Pinlistfile
定义 DUT的文件
mydut/mydut.sv SystemVerilog sourcefilefor the DUT
两个脚本,一个用于运行uvm代码生成器,另一个用于运行仿真(为了避免记住命令行及其参数)。
gen Scripttorunthecodegenerator run Scripttorunthe simulator
下面是这个示例中使用的 DUT 文件:
mydut/mydut.sv
module mydut (input clk, input byte data); always @(posedge clk) $display("mydut data = %h", data); endmodule
Interface template file
我们需要的第一个模板文件是The first template file。此文件表征一个 DUT的接口,指定一些变量名称,诸如UVM transaction中的变量和 SystemVerilog 接口中的变量。
clkndata.tpl
agent_name= clkndata trans_item =data_tx trans_var = rand byte data; if_port= logic clk; if_port= byte data; if_clock= clk
其中变量的含义,见名知意。
agent_name clkndata 将用作生成的许多文件名前缀,例如clkndata_agent、clkndata_if、clkndata_pkg 和 clkndata_config。
实际上,每个 DUT 接口都有一个这样的template file,每个template file都包含唯一的agent名称。
trans_item data_tx将用作类名,该类扩展uvm_sequence_item以定义生成的agent中使用事务transaction,即从sequener发送到driver和通过monitor的analysis port发送的transaction。
trans_var “=”后面的rand byta data将包含在生成的transaction类中。注意行尾的“;”:这很重要,因为它将被复制到生成的代码中。另外,如果希望变量随机化,请记住包含 rand 关键字。通常会有多个trans_var行。
if_port “=”后面的logic clk;和if_port= byte data;将包含在生成的 SystemVerilog interface中。同样,请注意行尾的“;”。即使是最简单的例子,我们也需要一个时钟和一个数据信号。最后,if_clock挑选出其中一个interface变量作为时钟信号。作为if_clock指定的名称必须是同一template 文件中if_ports之一。
Common template file
我们需要的第二个 template file是Common template file,必须命名为 common.tpl。uvm代码生成器始终需要一个common.tpl 文件,该文件指定了一些常用设置。只有一个设置是强制的,即dut_top,有大量可选设置可让你对生成的代码进行控制。许多设置具有合理的默认值,因此你可以在开始时忽略这些设置。
common.tpl
dut_top= mydut
dut_top指定DUT top module的名称,在本例中为 mydut。DUT 源文件必须放置在名为 ./dut 的目录中,或者你可以使用common.tpl文件设置dut_source_path选择其他目录名称,也可以在名为 files.f 的单个文件中手动列出文件的位置。
Filename pinlist
第三个template 文件是Pinlist file,它指定 DUT 的端口(在 DUT 的 SystemVerilog 代码中指定)和 DUT 接口的变量(在Interface template file
中指定)之间的连接。
Pinlist file
!clkndata_if clk clk data data
Pinlist file分为多个部分,每个 DUT 接口一个部分,每个部分以感叹号 “!” 开头,后跟接口名称,该名称始终是agent名称加上后缀_if。在这个示例中,只有一个agent clkndata,因此相应的接口名称为 clkndata_if。其余的每一行都包含 DUT top module的端口名称,后跟相应 DUT 接口中的变量名称。
也可以使用Pinlist file连接不属于任何特定interface的 DUT 端口,例如:
! clock_port global_clock_var reset_port global_reset_var
运行uvm代码生成器
在提供了三个template文件(clkndata.tpl,common.tpl,pinlist)和DUT文件(mydut.sv)之后,我们现在可以为这个示例运行uvm代码生成器。我们将命令行放在单行脚本文件中:
perl ../easier_uvm_gen.pl clkndata.tpl
Common template file的名称默认为 common.tpl(但可以使用 -m 开关从命令行进行设置。现在我们可以运行uvm代码生成器:
生成的结构如下所示。弄清楚代码生成器到底是做什么的最好方法是自己运行它!
top_tb (module) ↳ top_th (module instance) ↳ clkndata_if (interface instance) mydut (module instance) top_config (class uvm_object) ↳ top_test (object, class uvm_test) ↳ top_env (uvm_env) ↳ clkndata_config (uvm_object) clkndata_agent (uvm_agent) ↳ clkndata_sequencer clkndata_driver (uvm_driver) clkndata_monitor (uvm_monitor) clkndata_coverage (uvm_subscriber) ↳ top_default_seq (created in run_phase, class uvm_sequence) ↳ clkndata_default_seq (uvm_sequence) ↳ data_tx (uvm_sequence_item)
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !