https://blog.csdn.net/buzhiquxiang/article/
使用端口的仲裁器模型(由于systemverilog 中reg类型可以像wire一样连接块,为区别verilog中的reg类型,logic(单驱动))
interface arb_if(input bit clk);
logic [1:0] grant,request;
logic rst;
endinterface
1
2
3
4
如果希望在一个接口中放入一个新的信号,只需要在接口定义和实际使用这个接口的模块中做修改,而不需要改变其他任何模块。
使用modport将接口中的信号分组
在接口中使用modport结构能够将信号分组并指定方向
两种方法使用modport名,可以使用接口信号的程序和模块中使用modport名,也可以在顶层模块中使用modport名,然后把接口放在程序和模块的端口表中。
总线设计中需要为主、从设备和仲裁器定义三个modport,此外还需要一个监视modport,下面是一个仲裁器监视模块
interface arb_if(input bit clk);
logic [1:0]grant,request;
logic rst;
clocking cb @(posedge clk);//s
output request;
input grant;
endclocking
modport TEST(clocking cb,
output rst);
modport DUT(input request,rst,output grant);
endinterface
3、测试平台-设计间的竞争状态
(应当在时钟沿到达之前的Tsetup时间上采样)
4、程序块(program block)和时序区域(timing region)
如何将测试平台的事件与设计的事件分开调度?
(system verilog 引入一种新的时间片的划分方式)
在Active区域中,包括RTL、门级代码和时钟发生器(时间并不是单向前向流动-observed 和 Reactive 区域的事件可以触发本时钟周期内Active 区域中进一步的设计事件)
时钟块的默认时序在#1step 延时之后采样输入信号(1step 延时规定了信号在前一个时间片的postponed区域,在设计有任何新的动作之前被采样),在#0 延时之后驱动输出信号。
信号的采样:从时钟块中读取一个信号的时候,是在时钟沿之前得到采样值,例如postponed区域(注意此处使用的是=)
在接口中使用modport可以将信号分组并规定方向,任何同步接口信号都必须加上接口名arbif和时钟块名cb的前缀,例如arbif.cb.request是合法的,但arbif.request是非法的。
通过时钟块驱动接口信号:在时钟块中应当使用同步驱动,<=(由于信号在赋值后并不会立即改变,由于时钟块的默认输出延时是#0,所以使用<=,其值会立即传递到设计中)
接口的双向信号:在verilog中,需要用一个连续赋值语句将reg连接到wire
但是对于VCS,同时编译所有的system verilog代码,所以$unit是全局的;而DC一次编译一个模块或者一组模块,这时 $unit可能只包含一个或者几个文件的内容。
`timescale 1ns/1ns
parameter TIMEOUT=1_000_000;
top t1();
module top;
bit clk;
test t1(.*);
endmodule
bus.cb.request<=1;
repeat(2) @bus.cb;
a1:assert(bus.cb.grant==2'b01);
1
2
3
2、定制断言行为
一个立即断言有可选的then和else分句
interface arb_if(input bit clk);
logic [1:0] grant,request;
logic rst;