一、next,exit
这两个关键词有点类似于C语言中的continue和break.
PROCESS(A, B)
CONSTANT max_limit : INTEGER := 255;
BEGIN
FOR i IN 0 TO max_limit LOOP
IF (done(i) = TRUE) THEN
NEXT;
ELSE
done(i) := TRUE;
END IF;
q(i) <= a(i) AND b(i);
END LOOP;
END PROCESS;
如程序中用到了next,如果i还没有到达max_limit那么将会退出本次循环,i=i+1,然后继续循环。
PROCESS(a)
variable int_a : integer;
BEGIN
int_a := a;
FOR i IN 0 TO max_limit LOOP
IF (int_a <= 0) THEN -- less than or
EXIT; -- equal to
ELSE
int_a := int_a -1;
q(i) <= 3.1416 / REAL(int_a * i); -- signal
END IF; -- assign
END LOOP;
y <= q;
END PROCESS;
本例中使用了EXIT,当int_a<0时,那么程序将跳出loop循环,转而执行loop后的下一句话y<=q;
另外需要注意的是 EXIT支持嵌套,即是如果在loop中嵌套了loop,那么EXIT只会跳出最里层的loop.
另外EXIT还有一种语法 EXIT which_loop when(a<0); 在a<0满足时,跳出EXIT,不同的是现在的EXIT可以跳出指定loop(在loop有标签的情况下),如果没有指出,那么还是跳出最内层loop.
二、assert
assert是一个非常有用的语法,他可以判断一个boolean变量,如果该变量为假就输出一个用户指定的信息到终端(控制台),用户可以附带输出信息的严格等级,从低到高依次是:note,warning,error,failure,可以让用户区分信息的类型。同样assert语句也是不能被综合的。
assert可以同步语句(在process外),此时assert后面的任何变量变化都会引起assert语句判断一次。
assert还可以是顺序语句,此时assert存在于process中。
三、wait
使用wait语句,使设计者可以方便的在顺序语句中控制执行时间。可以用于process,procedure,function等子程序当中。
WAIT ON signal changes (signal)
WAIT UNTIL an expression is true (boolean_expression)
WAIT FOR a specific amount of time (time_expression)
PROCESS
BEGIN
WAIT UNTIL clock = ‘1’ AND clock’EVENT;
q <= d;
END PROCESS;
WAIT ON a, b; 只有a或者b 某一个信号变化才执行下面的语句。
WAIT UNTIL (( x * 10 ) < 100 ); 只有x<10才执行下面的句子,否则程序将会停在此处。
WAIT FOR 10 ns;
WAIT FOR ( a * ( b + c )); 程序在此处必须挂起这么多时间再执行下面的语句。
但是wait for语句会引起程序等待超时(有点像死锁),所以得注意使用。
可以使用语句 WAIT UNTIL (sendA = ‘0’) FOR 1 us;
ASSERT (sendA = ‘0’)
REPORT “sendA timed out at ‘0’”
SEVERITY ERROR; 这样可以消除等待超时。
process(clk) 相当于一个wait on clk在process的末尾,但是在有wait的process中不能有敏感信号表!同时注意wait on 必须在process的结尾。