连接设计和测试平台

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 always@(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 cb@(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块中最后一个语句时,仿真结束;

如果有多个程序块,仿真在最后一个程序块结束时结束;

 

posted @ 2016-06-02 18:52  冷冷北极  阅读(627)  评论(0编辑  收藏  举报