如何在VHDL中正确使用assert?
我在VHDL中有一个代码段,这使我不确定它是否正确: a和b是标准逻辑向量。c1和c0是标准逻辑。写得对吗?尤其是“c1='1'和c0='0'”这两个部分让我感到很困惑如何在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
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语法的。