Verilog for Verification

1.引言

  • Testbench也是一个模块(module...endmodule)
  • Testbench没有输入和输出,因为它是一个闭环,自己产生激励,灌给module,module输出响应,testbench会捕捉响应,进行比较,自己在自己内部形成闭环
  • 完成对待测设计的例化,测试代码的封装,提供测试激励,收集测试结果
  • 无需综合,行为级描述优先
module module_name_tb;
  //测试代码
endmodule

2.变量声明

  • 给待测设计的输入端口提供激励
  • 通过待测实际的输出端口收集激励
  • 提供激励的信号:reg类型信号进行声明,便于在initial和always中进行赋值
  • 收集激励的信号:reg或wire,多数情况下使用wire
// 名称关联的方式
apd_slave U_apb_slave(
  .pclk (pclk),
  .prestn (prestn),
  .paddr (paddr),
  .psel (psel),
  .pwrite (pwrite),
  .penable (penable),
  .pwdata (pwdata),
  .prdata (prdata)
);

3.激励

3.1 时钟产生

  • forever语句
  • 必须写在initial中
// clock generate
initial begin 
  pclk = 0;
  forever
  begin
    #10 pclk = ~pclk;   // 时钟周期是20个时间单位
  end 

3.2 reset信号

  • 低电平有效
  • 在某个时间点将reset置为0
reg rst_n;
initial begin
  rst_n = 1'b0;  // 复位信号置为低电平
  #45;
  rst_n = 1'b1;  // 延迟45个时间单位之后,将复位撤销
end

3.3 产生激励

  • wait(条件表达式),条件表达式为真的时候解除等待
initial begin
  ......
  wait(rst_n = 1'b1);
  wait(sim_start)
  ......
end
  • @(posegde clk) ...
initial
begin
  .....
  wait(rst_n = 1'b1);
  wait(sim_start);
  @(posedge pclk);
  a = 1'b1;
end


initial
begin
  .....
  wait(rst_n = 1'b1);
  wait(sim_start);
  @(posedge pclk);
  #3;               // 寄存器d到q端的延迟
  a = 1'b1;
end
  • function是不能有延迟信息语句的
  • task是可以具有延迟信息语句的