1、使用Interface的方法
a、首先定义一个interface
b、定义一个基于interface参数的设计模块module
c、定义一个基于interface参数的测试程序program
d、最后使用一个顶层将他们组合起来
例子4.4 仲裁器的简单接口
1 interface arb_if(input bit clk); 2 logic [1:0] grant,request; 3 logic rst; 4 endinterface
例子4.5 使用了简单接口的仲裁器
1 module arb(arb_if arbif); 2 ... 3 [email protected](posedge arbif.clk or posedge arbif.rst) 4 begin 5 if(arbif.rst) 6 arbif.grant <= 2‘b00; 7 else 8 arbif.grant<= next_grant; 9 ... 10 end 11 endmodule
//例子4.6:使用简单仲裁器接口的测试平台
1 module test(arb_if arbif); 2 ... 3 initial begin 4 //省略复位代码 5 6 @(posedge arbif.clk); 7 arbif.request<=2‘b01; 8 $display("@%0t:Drove req=01",$time); 9 repeat(2)@(posedge arbif.clk); 10 if(arbif.grant!=2‘b01) 11 $display("@%0t:a1:grant!=2‘b01",$time); 12 $finish 13 end 14 endmodule : test
//例子4.7:使用简单仲裁器接口的top模块
1 module top; 2 bit clk; 3 always #5 clk=~clk; 4 5 arb_if arbif(clk);//实例化一个interface 6 arb a1(arbif); //实例化一个module,参数调用上面实例化的interface 7 test t1(arbif); //实例化一个test,参数调用上面实例化的interface 8 9 endmodule:top
2、使用modport将信号分组
在接口中使用modport能够将信号分组并指定方向:
例4.10 带有modport的接口
例4.14 带时钟块的接口
1 interface arb_if(input bit clk); 2 logic [1:0] grant,request; 3 logic rst; 4 5 modport TEST(output request,rst,input grant,clk); 6 modport DUT(input request,rst,clk,output grant); 7 modport MONITOR(input request,grant,rst,clk); 8 9 endinterface
3、使用时钟块控制同步信号的时序
接口块可以使用时钟块来指定同步信号相对于时钟的时序,时钟块中的任何信号都将同步的驱动和或采样。
一旦定义了时钟块,测试平台就可以使用arbif.cb表达式等待时钟,而不需要确切的时钟信号和边沿。这样即使改变了时钟块中的时钟或变沿,也无需修改测试平台代码。、
//例4.14 带时钟块的接口
1 interface arb_if(input bit clk); 2 logic [1:0] grant,request; 3 logic rst; 4 5 clocking [email protected](posedge clk); //声明cb 6 output request; 7 input grant; 8 endclocking 9 10 modport TEST(clocking cb,//使用cb, 11 output rst); 12 modport DUT(input request,rst,output grant); 13 endinterface 14 15 //一个简单的测试程序 16 module test(arb_if.Test arbif); 17 initial begin 18 arbif.cb.request <= 0; 19 @arbif.cb; 20 $display("@%0t:Grant=",$time,arbif.cb.grant); 21 end 22 endmodule
说明:和4.10相比,TEST modport将request和grant视为同步信号。
4、接口中的logic和wire对比
a.接口中过程赋值语句驱动异步信号——logic
b.连续赋值语句驱动——wire
c.时钟块中的信号是同步信号——logic和wire
注:VMM将接口中的信号定义为wire型。
例4.15 如何驱动接口中的logic和wire信号
1 interface asynch_if(); 2 logic l; 3 wire w; 4 endinterface 5 6 module test(asynch_if ifc); 7 logic logic_wire; 8 assign ifc.w = logic_wire; 9 10 initial begin 11 ifc.l <= 0;//直接驱动异步logic信号 12 logic_wire <= l;//但是只能用assign驱动wire信号 13 end 14 endmodule
5、sv主要的调度区域
active——仿真模块中的设计代码
observed——执行sv断言
reactive——执行程序中的测试平台部分
postponed——为测试平台的输入采样信号
6、sv仿真的结束
如果只有一个程序块,那么完成所有initial块中最后一个语句时,仿真结束;
如果有多个程序块,仿真在最后一个程序块结束时结束;