带for循环的VHDL断言测试台

带for循环的VHDL断言测试台,vhdl,test-bench,Vhdl,Test Bench,我有一个VHDL问题:作为家庭作业,我们必须为VHDL设计的电路编写一个带有assert的测试台。我们应该测试每一个位比较器的信号组合。我想用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 :=

我有一个VHDL问题:作为家庭作业,我们必须为VHDL设计的电路编写一个带有assert的测试台。我们应该测试每一个位比较器的信号组合。我想用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";
测试台的架构ts是
信号a:std_逻辑_向量(3到0):=“0000”;
信号b:std_逻辑_向量(3到0):=“1011”;
信号c1、c0:std_逻辑:='0';
开始
测试:实体forBitVergleicher端口映射(a、b、c1、c0);
对于0到2**n循环中的i
在0到2**n循环中,k代表k
a无符号(a)和(c1='1'和c0=
“0”或c1='0'和c0='0'或c1='1'和c0='0'))
报告“错误”;
断言(a=b和((c1='1'和c0='1')或(c1/=c0)))
报告“错误”;
首先,我用Python测试了这个想法(for loop等),以检查它是否有效(确实有效)。现在我不知道为什么我的VHDL代码不能工作。我有很多错误报告,在我的脑海里是没有意义的。 有人有主意吗

COMP96错误COMP96_0329:“生成语句必须有标签。”“testbench.vhd”18 3 COMP96错误COMP960019:“应为关键字“generate”。“testbench.vhd”18 22 COMP96错误COMP960661:“不允许使用不同逻辑运算符序列的表达式。请将包含and、or、xor和xnor运算符的子表达式括起来。”“testbench.vhd”28 9 COMP96错误COMP960016:“预期设计单元声明。”“testbench.vhd”35 4

如果您需要,我有一个完整VHDL代码的链接:
您不能将
用于。。。循环
在过程(或函数/过程)之外。您应该为…输入
。。。在进程(或函数/过程)内循环,或使用
来。。。生成循环

但是,如果您将
用于。。。生成
循环(在进程外部),然后注意它必须有一个标签(如一条错误消息所述)。例如:

loop_label : for i in 0 to 2**n generate
...
end generate;
在您的特定情况下,我建议使用
来。。。在进程内循环
(末尾有一个
wait
语句)

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

其他一些需要考虑的问题:

  • n
    尚未定义
  • k表示k in…
    应该是
    表示k in…
  • 0到2**n
    将循环2**n+1次。您可能希望
    0到2**n-1
  • std\u逻辑向量(i)
    std\u逻辑向量(k)
    是非法的。您可能需要
    std\u逻辑\u向量(到无符号(i,4))
    等等
  • 您的assert语句可能应该指定
    严重性
    。例如,
    断言报告“错误”严重性故障
  • 你的缩进是不正确的,这使得你更可能犯错误。您的循环应该缩进得更像这样:

    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";
    
    用于0到2**n-1循环中的i
    对于0到2**n-1循环中的k
    
    一些建议:将循环放入进程中,在
    a
    b
    上应用刺激后,以及在
    c0
    c1
    上测试输出之前,添加wait。在子程序体中也可以找到循环语句<代码>使用work.all使BitVergliecher的实体声明在testbench中标记为
    TEST
    的实例化中可见。如果不知道
    c1
    c0
    意味着什么,就不可能提供有效的断言语句错误检测
    Zusatzlogik
    并不是特别有用。OP没有提供一个有效的解决方案。在没有中间等待语句的情况下,只有最后一次分配到
    a
    b
    才能导致信号更新。在投影输出波形中,任何特定的模拟时间只有一个条目。谢谢,我删除了关于实体库的部分。我想这只是我工作过的地方的惯例,而不是语言的要求。我还更正了可以使用
    for
    循环的地方。非常感谢您的回答。我用反馈修正了代码,我认为现在应该可以了:有人能解释为什么我的答案被否决了吗?我看不出它有什么大问题,但如果需要的话会进行修改。不需要我的否决票,但不需要严重性和表达式括号。这个建议很难读。