Verilog十大基本功2(testbench的设计 文件读取和写入操作 源代码)

需求说明:Verilog设计基础

内容       :testbench的设计 读取文件 写入文件

来自       :时间的诗


十大基本功之 testbench

1. 激励的产生


对于 testbench 而言,端口应当和被测试的 module 一一对应。
端口分为 input,output 和 inout 类型产生激励信号的时候,
input  对应的端口应当申明为 reg,
output 对应的端口申明为 wire,
inout  端口比较特殊,下面专门讲解。

1)直接赋值


一般用 initial 块给信号赋初值,initial 块执行一次,always 或者 forever 表示由事件激发反复执行。
举例,一个 module

`timescale 1ns/1ps

module exam();
  reg   rst_n;
  reg   clk;
  reg   data;
  
  initial
  begin
    clk = 1'b0;
    rst = 1'b1;
    #10
    rst = 1'b0;
    #500
    rst = 1'b1;
  end
  
  always
  begin
    #10 clk = ~clk;
  end
  
endmodule


大家应该注意到有个#符号,该符号的意思是指延迟相应的时间单位。该时间单位由 timscale 决定.


一般在 testbench 的开头定义时间单位和仿真精度,比如`timescale 1ns/1ps
前面一个是代表时间单位,后面一个代表仿真时间精度。
以上面的例子而言,一个时钟周期是 20 个单位,也就是 20ns。


而仿真时间精度的概念就是,你能看到 1.001ns 时对应的信号值,
而假如 timescale 1ns/1ns,1.001ns 时候的值就无法看到。
对于一个设计而言,时间刻度应该统一,如果设计文件和 testbench 里面的时间刻度不一致,
仿真器默认以 testbench 为准。


一个较好的办法是写一个 global.v 文件,然后用 include 的办法,可以防止这个问题。


对于反复执行的操作,可写成 task,然后调用,比如

  task load_count;
  
  input [3:0] load_value;
    begin
      @(negedge clk_50);
      $display($time, " << Loading the counter with %h >>", load_value);
      load_l   = 1’b0;
      count_in = load_value;
      @(negedge clk_50);
      load_l   = 1’b1;
    end
  endtask //of load_count
  
  initial
  begin
    load_count(4’hA); // 调用 task
  end


其他像 forever,for,function 等等语句用法类似,虽然不一定都能综合,但是
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值