【问题标题】:Basic unit testing基本单元测试
【发布时间】:2017-05-30 19:25:33
【问题描述】:

我是一名经验丰富的程序员,但对 HDL 不熟悉。我正在尝试弄清楚如何为我正在学习的课程的硬件设计实现基本单元测试。我知道 SVUnit,但我需要提交代码,所以我宁愿自己实现准系统测试功能。这也将帮助我了解更多信息。

我无法确定要使用的语言结构。我真正需要做的就是实例化一个组件,驱动输入,然后验证输出值。验证是我卡住的地方。这需要进入一个始终阻塞吗?

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

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

【问题讨论】:

  • 如果没有关于需要驱动哪些数据以及您希望如何知道它的工作原理的具体细节,这个问题的范围很广,
  • 添加了一个具体的例子
  • verilog+testbench+for+half+adder
  • 所有结果都驱动 DUT,但没有一个进行自动验证。
  • 您以与驱动程序相同的方式进行验证,除了不是将激励驱动到输入引脚,而是将输出引脚与预期结果进行比较。对于组合逻辑,预期的复位只是刺激的一个简单函数。

标签: verilog


【解决方案1】:

作为初稿,我会看一些类似的东西。

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

希望这能让你开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2014-08-06
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    相关资源
    最近更新 更多