首页 > 其他分享 >SystemVerilog -- 6.0 Interface

SystemVerilog -- 6.0 Interface

时间:2024-04-15 21:45:34浏览次数:24  
标签:enable clk -- data interface logic Interface DUT SystemVerilog

SystemVerilog Interface

What is an Interface ?

Interface 是一种将信号封装到 block 中的方法。所有相关信号组合到一起形成一个接口块,以便可以将其重新用于其他项目。此外,与 DUT 和其它验证组件的连接也变的更加容易。interface

Example

APB 总线协议信号被放在给定的接口中。请注意,信号在 interfaceendinterface 中声明。

interface 
    logic [31:0]   paddr;
    logic [31:0]   pwdata;
    logic [31:0]   prdata;
    logic          penable;
    logic          pwrite;
    logic          psel;
endinterface

Why are signals declared ? logic

logic是一种新的数据类型,允许您通过赋值语句和过程块来驱动这种类型的信号。请记住,在 verilog 中,您可以驱动 only in 过程块和 only in assign 语句。但这只是一个原因。reg wire

连接到 DUT 的信号应支持 4-state,一边可以捕获 X/Z 值。如果这些信号是bit,那么 X/Z 将显示为 0,并且您将错过 DUT 的 X/Z 值。

How to define port directions ?

接口信号可用于各种验证组件以及被测设备,因此用于定义信号方向。不同的modport定义可以传递给不同的组件,这使我们能够为每个组件定义不同的输入-输出方向。modport

interface myBus (input clk);
    logic [7:0] data;
    logic       enable;

    // From TestBench perspective, 'data' is input and `write` is output
    modport TB (input data, clk, output enable);

    // From DUT perspective, 'data' is output and `write` is input 
    modport DUT (output data, input enable, clk);
endinterface

How to connect an interface with DUT ?

应该实例化 DUT 的 top tb 模块中创建一个接口对象,并将其传递给 DUT。必须确保将正确的模块端口分配给 DUT。

module dut (myBus busIf);
    always @(posedge busIf.clk)begin
        if (busIf.enable)
            busIf.data <= busIf.data + 1;
        else
            busIf.data <= 0;
    end
endmodule

// Fillename : tb_top.sv
module tb_top;
    bit clk;
    
    // Create a clock
    always #10 clk = ~clk;

    // Create an interface object
    myBus busIf (clk);

    // Instantiate the DUT; pass modport DUT of busIf
    dut dut0 (busIf.DUT);

    // TestBench code : let's wiggle enable
    initial begin
        busIf.enable <= 0;
        #10 bufIf.enable <= 1;
        #40 bufIf.enable <= 0;
        #20 bufIf.enable <= 1;
        #100 $finish;
    end
endmodule

What are the advantages ?

接口可以包含任务、函数、参数、变量、功能覆盖率和断言。这使我们能够通过该区块内的接口监控和记录交易。无论有多少端口,连接到设计也变得更加容易,因为这些信息封装在接口中。

// Before interface
dut dut0 (
          .data(data),
          .enable(enable) // all other signals
         );
// With interface - higher level of abstraction possible
dut dut0 (busIf.DUT);

How to parameterize an interface ?

与模块相同的方式。

interface myBus #(parameter D_WIDTH=31) (input clk);
    logic [D_WIDTH-1:0] data;
    logic               enable;
endinterface

What are clocking blocks ?

时钟块内指定的信号将相对于该时钟进行采样/驱动。接口中可以有多个时钟块。请注意,这适用于与测试平台相关的信号。您希望控制 TB 何时从 DUT 驱动和采样信号。解决部分竞争条件,但不是全部。您还可以参数化偏斜值。

interface my_int (input bit clk);
    // Rest of interface code

    clocking cb_clk @(posedge clk);
      defdault input #3ns output #2ns;
      input  enable;
      output data;
    endclocking
endinterface

在上面的例子中,我们已经指定,默认情况下,输入应该在 clk 的位置之前采样 3ns,输出应该在 clk 的位置之后驱动 2ns。

How to use a clocking block ?

// To wait for posedge of clock
@busIf.cb_clk;

// To use clocking block signals
busIf.cb_clk.enable = 1;

如您所见,在enable 被 assign = 1 之前,您不必等待 clk 的上升沿。这样,您可以放心,再下一个上升沿 clk 之后,enable 信号将在下一个posedge clk之后2ns被驱动。

标签:enable,clk,--,data,interface,logic,Interface,DUT,SystemVerilog
From: https://www.cnblogs.com/sys-123456/p/18136938

相关文章

  • 异常捕获列表字典推导式
    【一】什么是异常异常是程序运行时可能发生的错误或意外情况。在Python中,异常是一种对象,表示程序执行期间发生的错误。当出现异常时,程序的正常流程会被中断,而是跳转到异常处理流程。【二】异常分类在Python中,异常分为两类:内建异常(Built-inExceptions):由Python内部定义的......
  • 数据库问题排查以及SQL优化
    数据库CPU飙高通过top等命令确定是否数据库进程CPU飙高通过命令showprocesslist找出耗资源较大的SQL如果没有特别耗资源的SQL,就查看session是不是突然增多,可以通过限制连接数如果有特别耗资源的SQL,排查耗资源的SQL是否命中索引、是否表的数据量特别大kill掉这个消耗大的线程......
  • 函数
    函数【一】函数的定义函数的定义就相当于事先将函数体代码保存起来,然后将内存地址赋值给函数名,函数名就是对这段代码的引用,这和变量的定义是相似的。函数的语法def函数名(参数1,参数2,...): 函数体 return值def:定义函数的关键字;函数名:函数名指向函数内存地址,是......
  • autoit 控制微信
    话不多说直接上代码。autoit控制微信发消息就更加简单了。IfWinActivate("微信")Then Send("^!w");这里使用了微信默认的快捷键CTRL+alt+w,打开微信程序。 Sleep(500) Send("^f");ctrl+f快捷键查找联系人 Sleep(50) ;查找一个叫TomCruise的人。 Send("TomCruise"......
  • P4298 [CTSC2008] 祭祀 题解
    P4298[CTSC2008]祭祀题解给定DAG,求最长反链长度,最长反链方案,有多少个点可以成为反链上的点。Case1熟知Dilworth定理:偏序集的最长反链的长度等于最小链划分。因为偏序集有传递性,所以我们也需要对DAG做一遍传递闭包。这样可以套用Dilworth定理,最小链划分等于点数减......
  • 记一次对某高校微信小程序的漏洞挖掘
    挖掘目标的部署在微信的资产(减少信息的收集,毕竟一般web站点没有账号密码不好进入后台,挖掘功能点少)1.寻找目标的微信小程序(非原图)2.招生小程序打不开,只能挖掘管理系统进入后发现存在上报安全隐患功能,可以上传图片3.准备上传shell发现控制上传名字参数为name,不是filename......
  • 【Xss-fiddler漏洞测试】通过该种方式 可以批量扫描也可以使用super xary 进行图形扫
    下载xary-社区版生成xary证书xxxgencaChrome安装证书-设置-隐私安全-安全-管理证书-导入 Chrome安装代理 Fiddler设置转向代理 命令行启动xary 启动xary,启动被测试网站-一边操作一边查看--触发后的命中效果    ......
  • 30 天精通 RxJS (20):Observable Operators - window, windowToggle, groupBy
    前几天我们讲完了能把HigherOrderObservable转成一般的Observable的operators,今天我们要讲能够把一般的Observable转成HigherOrderObservable的operators。其实前端不太有机会用到这类型的Operators,都是在比较特殊的需求下才会看到,但还是会有遇到的时候。Op......
  • Codeforces 1487F Ones
    考虑令\(l=|n|\),最高位为第\(1\)位,最低位为第\(l\)位。考虑选了一个\(\pm\underbrace{11\cdots11}_{i}\),那么显然会对\(l-i+1\siml\)位都有影响。于是能够知道第\(i\)位只有可能由\(<i\)的位影响。便可以考虑由高位到低位依次考虑,假设到了第\(i\)位。首......
  • ChromeDriver高版本下载
    chromedriver下载chromedriver114版本及以下的下载仓库地址:https://chromedriver.storage.googleapis.com/index.html chromedrvier从115版本开始从以前默认的仓库变成了新的地址发布:https://googlechromelabs.github.io/chrome-for-testing 新发布地址默认只列出......