基本单元测试

时间:2017-05-30 19:25:33

标签: verilog

我是一名体验程序员,但对HDL来说是新手。我正在试图弄清楚如何为我正在上课的硬件设计实现基本的单元测试。我知道SVUnit,但我需要提交代码,所以我更愿意自己实现准系统测试功能。这也有助于我了解更多信息。

我无法弄清楚要使用哪种语言结构。我真正需要做的就是实例化一个组件,驱动输入,然后验证输出值。验证是我被困的地方。这是否需要进入始终阻止?

即使指出我正确的方向,我应该谷歌搜索将是非常有帮助的。到目前为止,我已经尝试过:verilog modelsim单元测试,verilog modelsim自检测试平台等,没有太大的成功。

编辑:示例: 假设我有一个1位半加法器的设计。如何编写测试平台来练习每个可能的输入组合,并自动验证输出是否正确?

1 个答案:

答案 0 :(得分:0)

作为初稿,我会看一下像这样的东西。

reg clk = 0;
reg rst_n;
initial
begin 
  rst_n = 'bx;
  #5
  rst_n = 1'b0;
  #20
  rst_n = 1'b1;
end

always @(clk)
begin
  clk = #10 ~clk;
end

reg a,b;
wire adder = a + b;
task test;
  input i0,i1,o;
  a = i0;
  b = i1;
  #1
  if (adder !== o)
     $display("Error:Incorrect output");
endtask
initial
begin
  wait(rst_n === 1'b0);
  @(posedge clk)
  test(0,0,0);
  @(posedge clk)
  test(0,1,1);
  @(posedge clk)
  test(1,1,0);
  @(posedge clk)
  test(1,0,1);
end

然后你可以作为第二个草案实现测试数据,如:

wire [3:0] stim_data [1:0];
wire [3:0] expected_output;
always @(posedge clk)
  if (!rst_n)
  begin
    cnt <= 2'b00;
  end
  else
  begin
    cnt <= cnt + 1;
  end
assign {a,b} = stim_data[cnt];
always @(posedge clk)
  if (!rst_n)
  begin
  end
  else
  begin
    if (adder !== expected_output[cnt])
      // add error message
  end

希望这能让你开始。