《The UVM Primer》——chapter3: Interface and BFM

在上一章中,我们创建了一个比较合理的验证平台,具有以下几个特点:

  • 功能覆盖率

  • 自检功能

  • 带约束的随机激励

但是这个验证平台将所有模块文件都放在了一个文件里,这使得后期的修改、重用和debug都变得非常的困难。随着后期项目和设计的复杂演化,验证平台也将变得越来越弱,这是一个巨大的缺陷。等到了项目的后期,甚至一个小小的改动都将导致验证平台的崩溃。这样的验证平台也无法用于下一个设计里。

因此需要使用一种标准化方法来创建模块化的验证平台,每次加入新代码后,其功能就更强大,也可以很容易地加入新功能到验证平台。SystemVerilog的interface封装了验证平台中的port信号,让其在modules间和objects间共享这些信号。interface可以让我们很方便的共享信号,用它们来创建 BFM,就可以对简单的总线访问协议进行封装。

TinyALU BFM( Bus Functional Model)

tinyalu_bfm封装了所有TinyALU验证平台用到的信号,并提供了一个时钟,一个reset_alu( ) task还有一个向DUT发送指令的send_op( ) task。用定义module的方式来定义一个SystemVerilog interface。从使用 interface 关键字开始,在interface中定义信号。

BFM 提供了两个 task: reset_alu( )和 send_op( )。

reset_alu( ) task 用来拉低 reset 信号,等待几个时钟然后再次拉高。

send_op( )  task 用来向 ALU 发送指令并返回结果,展示了BFM是如何封装DUT相关的协议。

operation_t是一个tinyalu_pkg包中定义的枚举类型,在interface的顶部引入

tinyalu_pkg包。

在这个例子中, task将指令和数据放在op总线和操作数总线上,之后拉高start 信号并根据指令的要求对其进行拉低。

interface tinyalu_bfm;
   import tinyalu_pkg::*;

   byteunsigned        A;
   byteunsigned        B;
   bit          clk;
   bit          reset_n;
   wire [2:0]   op;
   bit          start;
   wire         done;
   wire [15:0]  result;
   operation_t  op_set;

   assign op = op_set;

   initialbegin
      clk = 0;
      foreverbegin
         #10;
         clk = ~clk;
      end
   end


   task reset_alu();
      reset_n = 1'b0;
      @(negedge clk);
      @(negedge clk);
      reset_n = 1'b1;
      start = 1'b0;
   endtask : reset_alu
   
  task send_op(inputbyte iA, inputbyte iB, input operation_t iop, outputshortint alu_result);
     
     op_set = iop;
     
     if (iop == rst_op) begin
         @(posedge clk);
         reset_n = 1'b0;
         start = 1'b0;
         @(posedge clk);
         #1;
         reset_n = 1'b1;
      endelsebegin
         @(negedge clk);
         A = iA;
         B = iB;
         start = 1'b1;
         if (iop == no_op) begin
            @(posedge clk);
            #1;
            start = 1'b0;           
         endelsebegin
            do
              @(negedge clk);
            while (done == 0);
            start = 1'b0;
         end
      end// else: !if(iop == rst_op)
      
   endtask : send_op

endinterface : tinyalu_bfm

对这个行为的封装有两个好处:

  • 不必再分散代码来处理协议级行为,调用这个 task 的代码比直接操作这些信号的代码要简单。

  • 可在一处修改所有协议级行为,一处修改可以传递到整个design。

通过BFM的创建,实现了我们三个验证平台操作(测试, 对比和覆盖)并将其连接至 DUT:

top

module top;
   tinyalu_bfm    bfm();
   tester     tester_i    (bfm);
   coverage   coverage_i  (bfm);
   scoreboard scoreboard_i(bfm);
   
   tinyalu DUT (.A(bfm.A), .B(bfm.B), .op(bfm.op), 
                .clk(bfm.clk), .reset_n(bfm.reset_n), 
                .start(bfm.start), .done(bfm.done), .result(bfm.result));
endmodule : top

验证平台包括 4 个部分:

  • tinyalu_bfm         一个包含所有信号级行为的SystemVerilog interface

  • tester                   一个生成测试激励的模块

  • coverage             一个提供功能覆盖的模块

  • scoreboard         一个测试结果的模块

在模块例化的时候,我们将interface传入,验证平台只有在DUT里有信号级的连接。我们可以看到DUT的例化引用了BFM内部的信号。

scoreboard

module scoreboard(tinyalu_bfm bfm);
   import tinyalu_pkg::*;

   always @(posedge bfm.done) begin
      shortint predicted_result;
      #1;
      case (bfm.op_set)
        add_op: predicted_result = bfm.A + bfm.B;
        and_op: predicted_result = bfm.A & bfm.B;
        xor_op: predicted_result = bfm.A ^ bfm.B;
        mul_op: predicted_result = bfm.A * bfm.B;
      endcase// case (op_set)

      if ((bfm.op_set != no_op) && (bfm.op_set != rst_op))
        if (predicted_result != bfm.result)
          $error ("FAILED: A: %0h  B: %0h  op: %s result: %0h",
                  bfm.A, bfm.B, bfm.op_set.name(), bfm.result);

   end
endmodule : scoreboard

通过用bfm的层次化的引用来访问BFM中的信号,剩余的逻辑跟之前验证平台

中的loop是一样的。

tester

module tester(tinyalu_bfm bfm);
   import tinyalu_pkg::*;

   function operation_t get_op();
      bit [2:0] op_choice;
      op_choice = $random;
      case (op_choice)
        3'b000 : return no_op;
        3'b001 : return add_op;
        3'b010 : return and_op;
        3'b011 : return xor_op;
        3'b100 : return mul_op;
        3'b101 : return no_op;
        3'b110 : return rst_op;
        3'b111 : return rst_op;
      endcase// case (op_choice)
   endfunction : get_op

   functionbyte get_data();
      bit [1:0] zero_ones;
      zero_ones = $random;
      if (zero_ones == 2'b00)
        return8'h00;
      elseif (zero_ones == 2'b11)
        return8'hFF;
      else
        return$random;
   endfunction : get_data
   
   initialbegin
      byteunsigned        iA;
      byteunsigned        iB;
      operation_t                  op_set;
      shortint     result;
      
      bfm.reset_alu();
      repeat (1000) begin : random_loop
         op_set = get_op();
         iA = get_data();
         iB = get_data();
         bfm.send_op(iA, iB, op_set, result);
      end : random_loop
      $stop;
   end// initial begin
endmodule : tester

tester 模块现在更简单了,因为它不再需要处理信号级的协议了,而只需调用BFM中的task。

总结

在本章中, 将验证平台拆分成便于管理的module。这个验证平台现在有4个编译单元:tinyalu_bfm interface 、tester、scoreboard 和 coverage module。在后续章节,将用OOP来实现这个基本的四部分架构。

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
avm是一个基于system verilog和systemc编程环境。它是为了开发复杂验证平台而设计的。就如学习c语言一样(或者system verilog或者systemc),它会需要一段时间去学习avm,从而知道如何更有效地去应用所有的概念。这本书的目的就是给你一个信心。如果这本书的作者把工作做得相当好,那么当你阅读这本书并且按里面的例子进行练习,肯定会有惊喜的体验。这个比喻性的概念在你的思想形成之后,你就会掌握avm中所有的结构并且知道如何应用。 目录 绪论 第1章 验证原理 1.1 验证基础 1.2 第一个验证平台 1.3 第二个验证平台 1.4 总结 第2章 avm综述 2.1 重用 2.2 验证组件和接口 2.3 层次化结构的验证平台 2.4 两个域 2.5 基于systemverilog avm概述 2.6 总结 第3章 面向对象程序设计的基本原理 3.1 面向过程vs.面向对象 3.2 类和对象 3.3 对象间关系 3.4 虚函数和多态 3.5 通用程序设计 3.6 作为组件的对象 . 3.7 oop和验证 第4章 tlm介绍 4.1 抽象(abstraction) 4.2 事务的定义(definilion of a transaction) 4.3 组件间的通信(communicating comf)onents) 4.4 使用通道(channel)来隔离组件 4.5 事务级连接(forming a transation—level connection) 4.6 小结 第5章 sustem vererilog中的avm机制 5.1 接口 5.2 连接组件 5.3 创建环境 5.4 连接硬件 5.5 报告 5.6 总结 第6章 验证平台基础 6.1 一个简单的存储器设计 6.2 激励产生器 6.3 监视器 6.4 三类状态机 6.5 驱动器 6.6 总结 第7章 完整的验证平台 7.1 分析端口和分析组件 7.2 记分板 7.3 覆盖率 7.4 注入错误 7.5 总结 第8章 逐步优化 8.1 事务级设计 8.2 riil替换 8.3 fpu作为黄金模型 8.4 小结 第9章 验证平台中的模块 9.1 非流水型总线实例 9.2 基于模块的断言监视器 9.3 总线功能模型(bfm) 9.4 总结 第10章 随机验证 10.1 crv方法概述 10.2 对类加入随机 10.3 用继承来实现层次约束 10.4 动态修改约束 10.5 过度约束 10.6 设定成员 10.7 动态数组 10.8 每个设计/每个测试配置 10.9 约束设计 10.10 类工厂 10.11 状态决定约束实例 10.12 avm随机激励生成器 第11章 avm与system verilog和sustemc 11.1 对象模型 11.2 对象的支持 11.3 封装行为 11.4 随机化 11.5 实例化与细节构建 11.6 事务级连接 11.7 执行阶段 11.8 创建完整的验证平台架构 11.9 选择systemverilog或systemc 附录a 符号说明 附录b 命名约定 附录c avm百科全书 附录d apache许可证 参考书目

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值