【问题标题】:VHDL assert testbench with for loop带有for循环的VHDL断言测试台
【发布时间】:2019-12-25 09:53:42
【问题描述】:

我有一个 VHDL 问题:对于家庭作业,我们必须为我们的 VHDL 设计电路编写一个带有断言的测试台。我们应该测试每个信号组合的 for bit 比较器。我想用一个 for 循环来解决这个问题,如下所示:

architecture ts of testbench is

signal a: std_logic_vector(3 downto 0) := "0000";
signal b: std_logic_vector(3 downto 0) := "1011";
signal c1, c0: std_logic := '0';

begin
TEST: entity forBitVergleicher port map(a, b, c1, c0);

  for i in 0 to 2**n loop
    k for k in 0 to 2**n loop

    a <= std_logic_vector(i); b <= std_logic_vector(k);
    assert(unsigned(a) > unsigned(b) and (c1 = '0' or c0 =
    '1') and (c1 = '0' and c0 = '0') and (c1 = '1' and c0 =
    '0')) 
    report "error";

    assert(unsigned(b) > unsigned(a) and (c1 = '1' and c0 =
    '0' or c1 = '0' and c0 = '0' or c1 = '1' and c0 = '0'))
    report "error";

    assert(a = b and ((c1 = '1' and c0 = '1') or (c1 /= c0)))
    report "error";

首先,我在 Python 中测试了这个想法(for 循环等),以检查它是否有效(确实有效)。好吧,现在我不知道为什么我的 VHDL 代码不起作用。我有很多错误报告在我看来没有意义。 有人有想法吗?

COMP96 错误 COMP96_0329:“生成语句必须有标签。” “测试台.vhd” 18 3 COMP96 错误 COMP96_0019:“需要关键字‘生成’。” “测试台.vhd”18 22 COMP96 错误 COMP96_0661:“不允许使用一系列不同逻辑运算符的表达式。将包含 and、or、xor 和 xnor 运算符的子表达式括起来。” “测试台.vhd”28 9 COMP96 错误 COMP96_0016:“需要设计单元声明。” "testbench.vhd" 35 4

如果您需要我有整个 VHDL 代码的链接: https://www.edaplayground.com/x/4c2n

【问题讨论】:

  • 一些建议:将循环放在一个进程中,在ab 上应用刺激之后以及在c0c1 上测试输出之前添加等待。跨度>

标签: vhdl test-bench


【解决方案1】:

您不能在进程(或函数/过程)之外使用for ... loop。您应该将for ... loop 放在进程(或函数/过程)中,或者使用for ... generate 循环。

但是,如果您使用for ... generate 循环(在进程外),请注意它必须有一个标签(如您的错误消息之一所述)。例如:

loop_label : for i in 0 to 2**n generate
...
end generate;

在您的具体情况下,我建议在进程中使用for ... loop(最后使用wait 语句)。

您的代码还有很多其他问题,但这至少可以帮助您克服第一个错误。

其他一些值得关注的问题:

  • n 尚未定义。
  • k for k in ... 应该是 for k in ...
  • 0 to 2**n 将循环 2**n + 1 次。你可能想要0 to 2**n-1
  • std_logic_vector(i)std_logic_vector(k) 是非法的。您可能想要std_logic_vector(to_unsigned(i, 4)) 等。
  • 您的断言语句可能应该指定severity。例如,assert &lt;something&gt; report "error" severity failure;
  • 您的缩进不正确,这使您更容易出错。你的循环应该像这样缩进:

    for i in 0 to 2**n-1 loop for k in 0 to 2**n-1 loop a <= std_logic_vector(to_unsigned(i, 4)); b <= std_logic_vector(to_unsigned(k, 4)); ... end loop; end loop;

  • &lt;a&gt; and &lt;b&gt; or &lt;c&gt; 这样的逻辑表达式毫无意义,将被编译器拒绝。你的意思是(&lt;a&gt; and &lt;b&gt;) or &lt;c&gt; 还是&lt;a&gt; and (&lt;b&gt; or &lt;c&gt;)。重要的是要了解您想要什么并适当地加上括号。
  • 在代码中混合语言通常被认为是不好的做法。选择德语或英语并坚持下去。

【讨论】:

  • 循环语句也可以在子程序体中找到。 use work.all; 使 BitVergliecher 的实体声明在测试台中标记为 TEST 的实例中可见。如果不知道c1c0 的含义,就不可能提供有效的断言语句错误检测。 Zusatzlogik 不是特别有用。 OP 不提供minimal reproducible example。如果没有干预等待语句,则只有对 ab 的最后分配可以导致信号更新。投影输出波形中的任何特定仿真时间只有一个条目。
  • 谢谢,我删除了关于实体库的部分。我想这只是我工作过的任何地方都使用的约定,而不是语言的要求。我还更正了可以使用for 循环的位置。
  • 非常感谢您的回答。我修复了代码的反馈,我认为它现在应该可以工作了:edaplayground.com/x/4c2n
  • 谁能解释为什么我的回答被否决了?我看不出它有什么大问题,但如果需要,我会进行修改。
  • 不是我的反对票,但不需要严重性,不需要表达式括号。缩进建议难以阅读。
猜你喜欢
  • 2018-02-14
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多