【盘古醒来】仿真平台中的几个关键字层次关系梳理

目录

一、验证平台中的关键字互调关系

二、先礼后兵:搞清关系 

三,小试牛刀


在上一章节中,我们主要提到仿真平台下,仿真平台构建对象的创建顺序,理解这个很重要,我们在搭建验证平台的时候,这一点,一定程度上影响着我们验证平台的鲁棒性。

此外,我们提到了业界大厂们都在用的VCS 工具,它一般支持的仿真步骤。该EDA工具的强大,远非仅仅几句话可描述的,笔者有整理常见的VCS工具使用专栏,感兴趣者可以去翻阅。

话说回来,我们虽然初略的知道,VCS 工具吃进去我们所有的RTL 和 TB 文件,如果有必要还可以吃进去各种动态库、静态库,好像一个能通吃一切的黑洞一般,然后编译链接成一个simv 可执行文件。该可执行程序载入内存,被CPU调度。

systemverilog 作为一门编程验证原因,自然也逃脱不了大部分原因所具备的一些属性。比如作用域问题,何时创建,何时消亡问题,以及在内存中存储的位置空间问题,等等甚至堆栈的概念。本专栏的主题是深入理解和总结归纳该语言的声明周期属性问题。思考了很久,不知道从哪里开始讲起。

最近,工作中遇到一个语法问题,原因是笔者在使用automatic 关键字的时候,用的位置不对,造成语法报错。哎,基本功不扎实,那就从基本开始讲吧。

本系列专栏,注重按照如下的构建验证平台中设计的一些关键字,讲起。来分析它们的生命周期属性。

一、验证平台中的关键字互调关系

下面的灵感触发导图,比较清晰的展现了几乎每个验证平台中,都在广泛使用的一些基本关键字。同时,它们也构成了设计和验证的基本框架。并不是每条线路,均被用到,仅仅局部性的展现互相调用的合法性。

上面的图示中,一定程度上诠释了,各个层次的引用关系。比如,在module中,我们可以创建module,program,interface,变量等等,但是不是绝对包含所有的从属关系。

二、先礼后兵:搞清关系 

(1)module :  它可以被综合,可以是顶层容器,可以内部实例化 module、interface、program, class, assertion等。注意,这里指的是可以实例化,但是笔者在实操过程中发现:在module 中是可以定义interface、class、assertion ,但是不可以定义module/program。在module 中,几乎可以使用任何语法语句和线程语句。

(2)program: 它和 module 很类似,但不可以被综合。其权限稍微低于module, module 中可以实例化program ,但是prgram中不可以实例化module/program/interface,特别注意的是其只能实例化interface。 systemverilog 中加入program的目的是为了解决testbech和rtl信号可能产生的竞争冒险现象。module在active 区域执行,而 program 在reactive 区域执行。program中可以使用initial begin...end, assgin, 但是不可以使用 always语句。(基于UVM的验证平台起来之后,program越来越不被喜欢,但是不排除某些情形下,program能起到大作用 )

(3)class : 支持继承,可以被实例化,可以通过句柄进行传递,但是不可以在内部进行实例化任何静态单元模块,比如interface、module、program。 也就是说,他不可以作为一个顶层的容器。另外注意,class 内部不可以进行 asserstion 断言语句。interface、module、program 虽然不可以被继承,但是却可以作为顶层,也可以容纳assertion 断言语句。

(4)interface:  接口可以笨拙地作为引用传递,这是非常重要的,其他静态元素都不能做到这一点。但是,它不能实例化一个模块module。但是,Interface 内部可以声明interface,  program ,不可以声明 module.

(5)package:  一种方便在module/program/interface/class 之间,共享用户定义数据类型的结构。它主要用于VCS 编译阶段对数据类型的解析问题。它的局限性在于:它不能包含module/program/interface 等这种具有全局命名空间属性的关键字。

三,小试牛刀

下面的例子,在module 中实例化了 program/module/interface。这里格外注意的是,虽然 program/module/interface 是很简单的模块,内部其实没什么,我们也没有想着进行数据信息交流,但是,在实例化它们的时候,必须在实例化名字后面加()。

`timescale 1ns/1ps
`define SV_DEFINE_MACROS(x) `"x`"
`define msg(x,y) `"x: `\`"y`\`"`"
`define SV_DEFINE_MACROS(x,y) `"x: `\`"y`\`"`"
import uvm_pkg::*;
`include "test/uvm_helloworld.sv"

program test;
initial begin end
endprogram

interface itf;
endinterface

module display;
endmodule

module tb_top();
//`include "uvm_macros.svh"
reg clk,rst;
logic [3:0] counter;

wire a;

initial begin
           clk = 0; 
forever #5 clk = ~ clk;
end

test  u_test();// 必须加(),否则编译报错

display u_display(); // 必须加(),否则编译报错

itf u_itf(); // 必须加(),否则编译报错

initial begin
    rst = 1'b0;
#30 rst = 1; 
end

always @ (posedge clk or posedge rst) begin
   if(!rst) 
       counter <= 4'b0000;
   else begin
       counter <= counter + 1 ;
       //$display("i am %s",`SV_DEFINE_MACROS(`UVM_NAME));
       $display("Hello, i am %s",`"`UVM_NAME`");
       $display(`msg(left side,right side));
       $display("Hello, i am %s",`SV_DEFINE_MACROS(`UVM_NAME,`UVM_NAME));
   end
end

assign a =0; 

initial begin
run_test("helloworld_test") ;
#60;
$finish();
end

initial begin
$fsdbDumpfile("tb_top.fsdb");
$fsdbDumpvars(0,"tb_top");
end

endmodule

接下来的几个章节,讲分别讲述这张层次关系导图的各个分支。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那么菜

你的鼓励和批评是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值