首页 > 其他分享 >SystemVerilog -- 6.4 Interface ~ Clocking Block Part II

SystemVerilog -- 6.4 Interface ~ Clocking Block Part II

时间:2024-04-28 21:57:37浏览次数:25  
标签:Clocking gnt clk -- cb req Part input 时钟

SystemVerilog Clocking Block Part II

时钟模块允许在指定的时钟事件对输入进行采样并驱动输出。如果提到时钟模块的输入skew,则该模块中的所有输入信号都将在时钟事件之前以skew时间单位进行采样。如果提到时钟模块的输出skew,则该模块中的输出信号都将在相应的时钟事件之后以skew时间单位驱动。

What are input and output skews ?

skew被指定为常量表达式或参数。如果仅使用一个数字,则skew被解释为遵循给定范围内的活动时间刻度。

clocking cb @(clk);
  input  #1ps req;
  output #2   gnt;
  input  #1 output #3 sig;
endclocking

在上面给出的示例中,我们声明了一个名为cb的时钟块,以描述何时必须对属于该块的信号进行采样。信号req被指定为具有1ps的偏移,并将在时钟边沿clk之前采样1ps。输出信号gnt的输出偏差为2个时间单位,因此将遵循当前示波器中遵循的时间刻度。如果我们的时间刻度为1ns/1ps,则#2表示2ns,因此将在时钟边沿后2ns驱动。最后一个信号sig是type的,将在时钟边沿之前1ns采样,在时钟边沿后3ns驱动。inout

输入skew表示信号应在前一个时间步长的末尾采样,或者换言之,应在positive clock edge之前采样。1step

clocking cb @(posedge clk);
  input #1step req;
endclocking

具有显示#0 skew 的输入将与其相应的时钟事件同时采样,但在 Observed 区域中以避免竞争条件。同样,在Re-NBA区域中,没有skew或显示#0的输出将与计时事件同时驱动。

Example

考虑一个简单的设计,输入clkreq,并驱动输出信号gnt。为了简单起见,让我们在收到请求后立刻提供赠款。

module des (input req, clk, output reg gnt);
  always @(posedge clk) begin
    if (req)
      gnt <= 1;
    else
      gnt <= 0;
  end
endmodule

为了处理设计端口信号,让我们创建一个名为_if的简单接口。

interface _if (input bit clk);
  logic gnt;
  logic req;

  clocking cb @(posedge clk);
    input  #1ns gnt;
    output #5   req;
  endclocking
endinterface

下一步是驱动设计的输入,使其返回授予信号。

module tb;
bit clk;

// Create a clock and initialize input signal
always #10 clk = ~clk;
initial begin
  clk <= 0;
  if0.cb.req <= 0;
end

// Instantiate the interface
_if if0 (.clk(clk));

// Instantiate the design
des d0 (
        .clk(clk),
        .req(if0.req),
        .gnt(if0.gnt)
       );

// Drive stimulus
initial begin
  for (int i = 0; i < 10; i++) begin
    bit[3:0] delay = $random;
    repeat (delay) @(posedge if0.clk);
    if0.cb.req <= ~ if0.cb.req;
  end 
  #20 $finiash;
end
endmodule

从仿真输出窗口可以看出,req是在时钟边沿之后#5ns驱动的。

Output skew

为了清楚地了解输出偏移,让我们调整界面,使其具有三个不同的时钟块,每个时钟块具有不同的输出偏移。然后,让我们用每个时钟块驱动req以查看差异。

interface _if (input bit clk);
  logic gnt;
  logic req;

  clocking cb_0 @(posedge clk);
    output #0 req;
  endclocking

  clocking cb_1 @(posedge clk);
    output #2 req;
  endclocking

  clocking cb_2 @(posedge clk);
    output #5 req;
  endclocking
  
endinterface

在我们的testbench中,我们将使用循环来迭代每个激励,并为每次迭代使用不同的时钟块。for

module tb;
  // ... part of code same as before

  // Drive stimulus
  initial begin
    for (int i = 0; i < 3; i++) begin
      repeat (2) @(if0.cb_0);
      case (i)
        0 : if0.cb_0.req <= 1;
        1 : if0.cb_1.req <= 1;
        2 : if0.cb_2.req <= 1;
      endcase
      repeat (2) @(if0.cb_0);
      if0.req <= 0;
    end
    #20 $finish;
  end
endmodule

Input skew

为了理解输入偏差,我们将更改 DUT 以仅 #1ns 提供一个随机值,仅用于我们的目的。

module des (output reg[3:0] gnt);
  always #1 gnt <= $random;
endmodule

接口模块将具有不同的时钟模块声明,就像之前一样,每个声明具有不同的输入偏差。

interface _if (input bit clk);
  logic [3:0] gnt;

  clocking cb_0 @(posedge clk);
    input #0 gnt;
  endclocking

  clocking cb_1 @(posedge clk);
    input #1step gnt;
  endclocking

  clocking cb_2 @(posedge clk);
    input #1 gnt;
  endclocking

  clocking cb_3 @(posedge clk);
    input #2 gnt;
  endclocking

endinterface

在testbench中,我们将在时间0ns分叉4个不同的线程,其中每个线程等待适中的正边沿并采样 DUT 的输出。

module tb;
  bit clk;

  always #5 clk = ~clk;

  _if if0 (.clk(clk));
  des d0 (.gnt(if0.gnt));

  initial begin
    fork
      begin
        @(if0.cb_0);
        $display("cb_0.gnt = 0x%0h", if0.cb_0.gnt);
      end
      begin
        @(if0.cb_1);
        $display("cb_1.gnt = 0x%0h", if0.cb_1.gnt);
      end
      begin
        @(if0.cb_2);
        $display("cb_2.gnt = 0x%0h", if0.cb_2.gnt);
      end
      begin
        @(if0.cb_3);
        $display("cb_3.gnt = 0x%0h", if0.cb_3.gnt);
      end
    join
    #10 $finish;
  end
endmodule

输出波形如下图所示,可以看出该设计每#1ns驱动一个随机值。

需要注意的是,通过时钟块采样cb_1testbench代码设法获得了0x3值,而cb_0得到了0xd。请注意,对于其他模拟器,这些值可能不同,因为它们可以采用不同的随机化种子值。

模拟日志

ncsim> run
cb_3.gnt = 0x9
cb_2.gnt = 0x3
cb_1.gnt = 0x3
cb_0.gnt = 0xd
Simulation complete via $finish(1) at time 15 NS + 0

标签:Clocking,gnt,clk,--,cb,req,Part,input,时钟
From: https://www.cnblogs.com/sys-123456/p/18161864

相关文章

  • 虚拟dom
    什么是虚拟dom?虚拟dom本质上就是一个普通的JS对象,用于描述视图的界面结构在vue中,每个组件都有一个render函数,每个render函数都会返回一个虚拟dom树,这也就意味着每个组件都对应一棵虚拟DOM树为什么需要虚拟dom?在vue中,渲染视图会调用render函数,这种渲染不仅发生在组件创建......
  • C - Merge the balls
    C-Mergetheballshttps://atcoder.jp/contests/abc351/tasks/abc351_c 思路使用stack记录序列路径对栈顶两个元素尝试做缩减处理。 Codehttps://atcoder.jp/contests/abc351/submissions/52873456intn;stack<longlong>sq;intmain(){cin>>n;......
  • 短信验证码登录接口,如何防止恶意攻击
    本文相关词汇:OTP-One-TimePassword一次性动态密码,这种验证码具有时效性,通常有效期在1~2分钟内。手机短信验证码就是一种OTP。MFA-多重因子认证。先说单因子认证,我们的系统登录通常是账密登录,这种就是单因子认证方式的登录。现在为了安全,许多网站开始使用双因子认证登录......
  • v-model
    v-model即可以作用于表单元素,又可作用于自定义组件,无论是哪一种情况,它都是一个语法糖,最终会生成一个属性和一个事件当其作用于表单元素时,vue会根据作用的表单元素类型而生成合适的属性和事件。例如,作用于普通文本框的时候,它会生成value属性和input事件,而当其作用于单选框或多选框......
  • Java流程控制
    输入流ScannerScannerscanner=newScanner(System.in);通常会用hasNext()或者hasNextLine()来判断还有没有输入字符,用next(),nextLine()来接收用户的输入next():一定要读取到有效字符后才能结束输入;对有效字符钱的空白会自动去掉,有效字符后的空白作为分隔符或者结束符,不能......
  • 日志分析-redis应急响应
    简介服务器场景操作系统Linux服务器账号密码rootxjredis任务环境说明注:样本请勿在本地运行!!!样本请勿在本地运行!!!样本请勿在本地运行!!!应急响应工程师小王某人收到安全设备告警服务器被植入恶意文件,请上机排查步骤#1通过本地PCSSH到服务器并且分析黑客攻击成功的IP为......
  • 日志分析-mysql应急响应
    简介mysql应急响应ssh账号root密码xjmysqlsshenv.xj.edisec.net-pxxxxx1.黑客第一次写入的shellflag{关键字符串}2.黑客反弹shell的ipflag{ip}3.黑客提权文件的完整路径md5flag{md5}注/xxx/xxx/xxx/xxx/xxx.xx4.黑客获取的权限flag步骤#1步骤#2/var/l......
  • start windows executable in multi-process and wait its ending
    theexecutableimporttimeimportrandomimportsystime.sleep(random.random())print(sys.argv[1])thecallingcontrolimportsubprocessll=[]foriiinrange(8):ll.append(subprocess.Popen(f"pythonab.pymk{ii}"#maybesom......
  • vector开二维数组&&深搜迷宫问题&&BFS
    vector<vector>vis(N+10(一维的大小),vector(N+10(二维的大小),0(初始化赋值)),step(N+10,vector(N+10,0));vector<vector>vis(N+10,vector(N+10)),step(N+10,vector(N+10));开数组大小一定要超过题目本身大小;#include<bits/stdc++.h>usingnamespacestd;#defineintl......
  • 问题:“git”不是内部命令
    问题:明明刚安装完git,在使用git命令时却显示不是内部命令因为没有配环境变量1、找到git安装目录,找到git里的bin路径,复制2、打开电脑里的计算机=》属性=》高级系统设置,我的是系统=》系统信息=》高级系统设置选择环境变量环境变量有两处需要改的,用户变量和系统变量,先改用户变......