如何在VHDL中正确使用assert?

如何在VHDL中正确使用assert?,vhdl,assert,test-bench,Vhdl,Assert,Test Bench,我在VHDL中有一个代码段,这使我不确定它是否正确: a和b是标准逻辑向量。c1和c0是标准逻辑。写得对吗?尤其是“c1='1'和c0='0'”这两个部分让我感到很困惑 if unsigned(a) > unsigned(b) then assert(c1 = '1' and c0 = '0') 编辑:这里有一个更大的代码段: signal a: std_logic_vector(3 downto 0); signal b: std_logic_vector(3

我在VHDL中有一个代码段,这使我不确定它是否正确: a和b是标准逻辑向量。c1和c0是标准逻辑。写得对吗?尤其是“c1='1'和c0='0'”这两个部分让我感到很困惑

if unsigned(a) > unsigned(b) then
    assert(c1 = '1' and c0 = '0')
编辑:这里有一个更大的代码段:

    signal a: std_logic_vector(3 downto 0);
    signal b: std_logic_vector(3 downto 0);
    signal c1: std_logic;
    signal c0: std_logic;

    begin
    TEST: forBitComperator port map(a, b, c1, c0);
      process
      begin
        for i in 0 to 2**4-1 loop
            for k in 0 to 2**4-1 loop

                wait for 0 ns;

                a <= conv_std_logic_vector(i, 4);
                b <= conv_std_logic_vector(k, 4);

                if i > k then
                  assert c1 = '1' and c0 = '0'
                  report "error ";
               end if;
        end loop;
    end loop;
    wait;
  end process;
end;
信号a:std_逻辑_向量(3到0);
信号b:标准逻辑向量(3到0);
信号c1:std_逻辑;
信号c0:std_逻辑;
开始
测试:forBitComperator端口图(a、b、c1、c0);
过程
开始
对于0到2**4-1循环中的i
对于0到2**4-1循环中的k
等待0ns;

a您不确定的零件是正确的
c0
c1
'0'
'1'
都是
std_逻辑
,因此以这种方式比较它们是正确的。(在VHDL中,
=是相等比较运算符。它不像在许多软件编程语言中那样执行赋值)。每次比较的结果都是布尔值(
true
false
),因此可以与
assert
语句一起使用

我认为唯一真正错误的部分是,您必须以
end if
结束
if
。通常还建议,每当您使用
断言
,您
报告
错误消息并设置
严重性
(例如
注意
警告
错误
故障
,具体取决于错误的严重程度)。当然,它也必须以
终止

因此:

if unsigned(a) > unsigned(b) then
    assert c1 = '1' and c0 = '0' report "<Error message>" severity warning;
end if;
如果未签名(a)>未签名(b),则
断言c1='1'和c0='0'报告“严重性警告”;
如果结束;

缺少report或severity子句的断言语句应以分号终止(IEEE Std 1076-2008 10.3断言语句“断言语句检查指定条件是否为真,如果不为真则报告错误”)。断言语句在语法上是正确的,有一条默认错误消息。一个关于使用语义的特定问题可能会从一个示例中受益,该示例还演示了对象声明,c1和c0显然是某种字符枚举类型。封闭的if语句(10.8)在语法上不完整。括号在断言语句片段中是多余的。用括号括起来的表达式只有在没有括号的情况下也有效时才有效,显示的表达式只包含一个逻辑运算符,不需要括号来建立优先级(9.1,9.2.1)。你说得对,谢谢。我强烈建议你保留所有
end
语句。删除它们只会造成不必要的混乱。对不起,我添加了它们(我看到我删除了等待语句)。谢谢您的回答。哦,你说得对,我没有在我的帖子中抄写“如果结束”。嗯,这仍然很奇怪,因为assert在我的testbench中只生成错误(如果我手动测试这些情况,它们是正确的)。你的意思是它报告语法错误(在编译时)还是断言错误(在运行时)?我认为您的代码可能是正确的,它正确地报告了错误,但您不明白为什么。如果你想得到帮助,你需要提供更具体的细节。嗯,这仍然很奇怪,因为断言只在我的测试台上生成错误。。。如果c1/='1'或c0/='0'(DeMorgan定理),则条件
c1='1'和c0='0'
将计算为FALSE,从而导致断言。你的三个问题中没有一个清楚地说明c1和c0代表什么,也没有演示你试图生成VHDL等价物的原始Python代码,但都没有成功。我指的是断言错误。c1和c0表示位:例如,c1=1和c0=0表示a>b。c1=0和c0=1 A手动检查结果时,如何执行此操作?你只是在你的模拟器里看波形图吗?它们看起来一样吗?是否在波形图中展开增量周期?如果您不理解delta循环的概念,测试组合逻辑可能会非常混乱。我怀疑这可能是你的问题。检查这一点的一种方法是简单地注册
i
k
c0
c1
(因此它们都是同步的),然后查看错误是否消失。然而,我们现在离你最初的问题已经很远了,那是关于VHDL语法的。