systemverilog中的bind

这篇具有很好参考价值的文章主要介绍了systemverilog中的bind。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最早接触 bind 关键字是在assertion 当中,将assertion 与 dut 进行绑定连接,如下例子:

bind cpu fpu_props fpu_rules_1(a,b,c);
//cpu 是module 名字
//fpu_props 是内部包含 property 以及断言的模块,可以是 module 或者 program 甚至 interface
//fpu_rules_1 是 fpu_props 的实例名
//括号中的信号 a b c 是 cpu 的端口信号,并且连接到 fpu_props 的对应端口

来看下面一个将 interface bind 到 module 的例子:

interface range (input clk,enable, input int minval,expr);
    property crange_en;
        @(posedge clk) enable |-> (minval <= expr);
    endproperty
    range_chk: assert property (crange_en);
endinteface

bind cr_unit range r1(c_clk,c_en,v_low,(in1&&in2));

可以看到,包含断言的 interface ,其端口信号的方向均为 input ,也就是说 property 中包含的信号都是从 interface 的外部给进来的;

实际上, bind 不仅仅 可以进行 断言 与 dut 之间的连接,两个 module 之间也能进行连接,如下面例子:

有 dut.v :

module dut(clk, rst_n, vld, rdy, data);
  input clk;
  input rst_n;
  input vld;
  output reg rdy;
  output reg[31:0] data; 
  
  bit[31:0] count;
  
  always @(posedge clk) begin
    if(rst_n == 0)begin
    end
    else begin
      count ++;
      data <= count; 
      if(count == 150)begin
        $finish;
      end
    end
  end
endmodule

dut_assert.sv :

module dut_assert(clk_sva, rst_n_sva, vld_sva, rdy_sva, data_sva);//这里全都是 input 
  input clk_sva,rst_n_sva,vld_sva;
  input rdy_sva;
  input reg[31:0] data_sva; 
  
  
  always @(posedge clk_sva)begin
    
    @(posedge clk_sva);
    
  	if(data_sva == 10)begin
    	$display("++++canli data_sva is %d at %0t",data_sva, $time);
  	end
  	if(data_sva == 13)begin
    	$display("****canli data_sva is %d at %0t",data_sva, $time);
  	end
  end
endmodule

test.sv :

module test;
  
  bit clk;
  bit rst_n;
  bit [31:0] data;
  bit rdy;
  
  initial begin
    #10 rst_n = 1;
    forever begin
      #1 clk = ~clk;
    end
    
  end
  initial begin
  		$timeformat(-9, 0, "ns", 20);
		$fsdbDumpfile("top.fsdb");
		$fsdbDumpvars(0, test);
		$fsdbDumpflush;
		$fsdbDumpSVA;  
  end
  
  dut my_dut(.clk(clk),.rst_n(rst_n),.vld(1'd0),.rdy(rdy),.data(data));
  
endmodule

然后通过 bind 将 dut 与 dut_assert 连接起来,写在 assert.sv 中:

bind dut dut_assert my_assert(
	.clk_sva(clk), 
	.rst_n_sva(rst_n),
	.vld_sva(vld),
	.rdy_sva(rdy),
	.data_sva(data)
);

然后filelist 文件如下:

./dut.v
./dut_assert.sv
./assert.sv
./test.sv

运行结果如下:

systemverilog bind,systemverilog assertion,systemverilog,前端,javascript,开发语言

 从上面的例子可以看到:即使 dut_assert.sv 中不包含 断言,bind 依旧可以将 dut_assert 与 dut 连接起来;不过一般来说,在 dut_assert 中一般添加断言来检测dut,否则这样的 bind 看上去似乎没啥子意义;

也可以将 bind 语句加到 test.sv 中,运行结果是一样的,如下:

module test;
  
  bit clk;
  bit rst_n;
  bit [31:0] data1;
  bit [31:0] data2;
  bit rdy1;
  bit rdy2;
  
  initial begin
    #10 rst_n = 1;
    forever begin
      #1 clk = ~clk;
    end
    
  end
  initial begin
  		$timeformat(-9, 0, "ns", 20);
		$fsdbDumpfile("top.fsdb");
		$fsdbDumpvars(0, test);
		$fsdbDumpflush;
		$fsdbDumpSVA;  
  end
  
  dut my_dut(.clk(clk),.rst_n(rst_n),.vld(1'd0),.rdy(rdy1),.data(data1));

	bind dut dut_assert my_assert(//这里的 dut 也可以是 my_dut
	.clk_sva(clk), 
	.rst_n_sva(rst_n),
	.vld_sva(vld),
	.rdy_sva(rdy),
	.data_sva(data)
);
  
endmodule

此时,如果将 dut 实例化2次,如下:

module test;
  
  bit cl;//注意这里名字变了
  bit rst_n;
  bit [31:0] data1;
  bit [31:0] data2;
  bit rdy1;
  bit rdy2;
  
  initial begin
    #10 rst_n = 1;
    forever begin
      #1 cl = ~cl;
    end
    
  end
  initial begin
  		$timeformat(-9, 0, "ns", 20);
		$fsdbDumpfile("top.fsdb");
		$fsdbDumpvars(0, test);
		$fsdbDumpflush;
		$fsdbDumpSVA;  
  end
  
  dut my_dut1(.clk(cl),.rst_n(rst_n),.vld(1'd0),.rdy(rdy1),.data(data1));
  dut my_dut2(.clk(cl),.rst_n(rst_n),.vld(1'd0),.rdy(rdy2),.data(data2));

	bind dut dut_assert my_assert(//注意这里 bind 的还是 dut
	.clk_sva(clk), //这里绑定的还是 clk
	.rst_n_sva(rst_n),
	.vld_sva(vld),
	.rdy_sva(rdy),
	.data_sva(data)
);
  
endmodule

运行结果如下:

systemverilog bind,systemverilog assertion,systemverilog,前端,javascript,开发语言

可以看到,此时 bind dut,相当于 bind 了2次,所以打印语句打印2次;如果将上面的 bind dut 修改:

module test;
  
  bit cl;
  bit rst_n;
  bit [31:0] data1;
  bit [31:0] data2;
  bit rdy1;
  bit rdy2;
  
  initial begin
    #10 rst_n = 1;
    forever begin
      #1 cl = ~cl;
    end
    
  end
  initial begin
  		$timeformat(-9, 0, "ns", 20);
		$fsdbDumpfile("top.fsdb");
		$fsdbDumpvars(0, test);
		$fsdbDumpflush;
		$fsdbDumpSVA;  
  end
  
  dut my_dut1(.clk(cl),.rst_n(rst_n),.vld(1'd0),.rdy(rdy1),.data(data1));
  dut my_dut2(.clk(cl),.rst_n(rst_n),.vld(1'd0),.rdy(rdy2),.data(data2));

	bind my_dut1 dut_assert my_assert(// 这里 bind 的修改为 my_dut1
	.clk_sva(clk), 
	.rst_n_sva(rst_n),
	.vld_sva(vld),
	.rdy_sva(rdy),
	.data_sva(data)
);
  
endmodule

 运行结果如下:

systemverilog bind,systemverilog assertion,systemverilog,前端,javascript,开发语言

也就是说,此时改为 dut 的实例名,相当于只 bind 了1次,所以打印1次;如果修改 bind 的端口信号名:

module test;
  
  bit cl;
  bit rst_n;
  bit [31:0] data1;
  bit [31:0] data2;
  bit rdy1;
  bit rdy2;
  
  initial begin
    #10 rst_n = 1;
    forever begin
      #1 cl = ~cl;
    end
    
  end
  initial begin
  		$timeformat(-9, 0, "ns", 20);
		$fsdbDumpfile("top.fsdb");
		$fsdbDumpvars(0, test);
		$fsdbDumpflush;
		$fsdbDumpSVA;  
  end
  
  dut my_dut1(.clk(cl),.rst_n(rst_n),.vld(1'd0),.rdy(rdy1),.data(data1));
  dut my_dut2(.clk(cl),.rst_n(rst_n),.vld(1'd0),.rdy(rdy2),.data(data2));

	bind my_dut1 dut_assert my_assert(
	.clk_sva(cl), //这里 bind 的信号改为 cl
	.rst_n_sva(rst_n),
	.vld_sva(vld),
	.rdy_sva(rdy),
	.data_sva(data)
);
  
endmodule

 此时运行会报错,如下:

systemverilog bind,systemverilog assertion,systemverilog,前端,javascript,开发语言

 由此,可以得出结论,bind 时,bind 的 dut 中的信号必须是 dut module中的信号名,而不能是 dut 实例的输入输出信号名!!

最近看到一种bind 方式来大批量 bind ,语法如下:

bind module_name: module_inst_name1, module_inst_name2...  
checker_module[#(.Para(xx))]  checker_module_inst 
// checker_module 可以带 parameter

例子如下:文章来源地址https://www.toymoban.com/news/detail-688619.html

bind DUT: dut_inst1, dut_inst2  checker#(.a(1)) checker_inst(.*);

到了这里,关于systemverilog中的bind的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SystemVerilog中的切片操作

    在硬件描述语言中,信号切片操作是指对信号中的某个或某几个位进行访问或操作 其中, signal_name 是要进行切片操作的信号名, start_index 是切片的起始位置, length 是切片的长度。 例如,如果有一个32位的信号 my_signal ,需要获取该信号的第16到第23个位(包括第16和第23个位

    2024年02月02日
    浏览(43)
  • 【JavaScript】你真的熟悉bind吗

    看了本文您能了解到的知识! 在本篇文章中,将带你了解 什么是bind , bind的用途 、 如何手写bind 以及 工作中实际使用bind的场景 。 在JavaScript中, bind() 方法是用来 创建一个新函数 ,并将其 绑定到指定的对象 上,从而在调用该函数时确保函数中的 this 指向绑定的对

    2024年02月16日
    浏览(38)
  • 前端性能优化的利器 ——— 浅谈JavaScript中的防抖和节流

    防抖和节流函数是工作中两种常用的前端性能优化函数,今天我就来总结一下什么是防抖和节流,并详细说明一下如何在工作中应用防抖和节流函数 在 JavaScript 中,防抖(debounce)和节流(throttle)是用来限制函数执行频率的两种常见技术。 防抖(debounce) 是指在某个时间段

    2024年02月14日
    浏览(51)
  • systemverilog中的参数传递——ref、input、output

    sv中的静态数组、动态数组、队列都是用一块内存存放,而他们的名字作为该内存的地址,这点和c一致,但sv中没有指针的概念。 传递这种大片内存的值一般只有两种规则: 1.地址传递,函数内部修改可以改变函数调用的值。 2.值传递,将整片空间复制一份,函数内部修改不

    2024年02月15日
    浏览(45)
  • JavaScript中的数据缓存与内存泄露:解密前端性能优化与代码健康

    ​🌈个人主页:前端青山 🔥系列专栏:JavaScript篇 🔖 人终将被年少不可得之物困其一生 依旧 青山 ,本期给大家带来JavaScript篇专栏内容:JavaScript-数据缓存与内存泄露 目录 说说你对事件循环的理解 一、是什么 二、宏任务与微任务 微任务 宏任务 三、async与await async await 四、

    2024年02月03日
    浏览(76)
  • JavaScript前端中的伪类元素before和after使用详解

    在前端开发中,伪类是一种让你可以选择元素的某个状态或位置的 CSS 选择器。其中, :before 和 :after 伪类允许你在一个元素之前或之后插入内容。 :before 和 :after 伪类创建的元素是不在 HTML 文档中的,它们是通过 CSS 生成的。可以用它们来在一个元素的前面或后面插入一些内

    2024年02月14日
    浏览(42)
  • 【剧前爆米花--前端三剑客】JavaScript(WebAPI)中的相关方法和实例

    作者:困了电视剧 专栏:《JavaEE初阶》 文章分布:这是一篇关于JavaScript(WebAPI)的文章,在这篇文章中我会简单介绍一些常用的js方法,并给出他们的应用实例,希望对你有所帮助!   目录 什么是WebAPI DOM的基本概念 什么是DOM DOM树 事件初识 基本概念 事件三要素 获取元素

    2024年02月16日
    浏览(47)
  • javaScript手写专题——实现instanceof/call/apply/bind/new的过程/继承方式

    目录 原型链相关 手写instanceof 实现一个_instance方法,判断对象obj是否是target的实例  测试  手写new的过程 实现一个myNew方法,接收一个构造函数以及构造函数的参数,返回构造函数创建的实例对象 测试myNew方法 手写类的继承 ES6:class+extends实现继承 组合继承:调用两次父类

    2024年04月14日
    浏览(92)
  • 前端 JS 经典:apply、call、bind

    1. 概念 都是用来改变函数中 this 指向的。区别在于 apply、call 传参方式不一样,调用后,直接执行函数。bind 调用后,返回一个函数体,不直接执行函数。 2. 为什么用 那为什么要改变 this 指向呢。正常情况下,谁调用函数 this 就指向谁。那调用这个函数的那个谁,要访问另一

    2024年02月07日
    浏览(41)
  • JS 中的.bind是什么

    ✨解释说明 示例 .bind 是 JavaScript 中的一个内置方法,可以将一个函数绑定到一个指定的对象上,从而改变该函数内部 this 的指向。.bind 方法的语法如下 其中,thisArg 是需要绑定的指定对象,arg1、arg2 等是可选的参数列表,指定了调用函数时所传递的参数。 例如,假设有一个

    2024年02月06日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包