|
http://www.pld.com.cn/HDL/systemverilog/3.htm
20. 块名字和语句标签
在verilog中,我们可以通过在begin或fork关键字之后指定名字来为begin-end或fork-jion语句指定名字。这个指定的名字代表整个语句块。SystemVerilog还允许在end或jion关键字之后指定一个匹配的块名字。这种机制很容易将end或jion与对应的begin或fork联系起来,尤其是在一个长的块或嵌套的块中。块结尾处的名字是可选的,但如果使用的话,它必须与块起始处的名字相同。例如:
layout-grid-align: none; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt" align=left>begin: foo // 在begin之后的块名字
…
fork: bar // 具有名字的嵌套的块
…
jion: bar // 必须具有相同的名字
…
end: foo // 必须具有相同的名字
SystemVerilog还允许像C语言一样为单个语句设置标签。语句标签放置在语句的前面,用来标识这条语句。例如:
initial begin
test1: read_enable = 0;
…
test2: for (i=0; i<=255; i++)
…
end
21. 对事件控制的增强
Verilog使用@标记来控制基于特定事件的执行流,SystemVerilog增强了@事件控制。
l 有条件的事件控制
@标记的一个基本应用就是推断一个具有使能输入的锁存器。下面的例子演示了一个锁存器建模的基本风格。
always @(data or en)
if (en) y <= data;
这种编码风格对仿真来说是效率低下的,因为即使在使能输入无效的时候,数据输入的每次改变都会触发事件控制。
SystemVerilog在事件控制中加入了一个iff条件。只有iff条件为真的条件下,事件控制才会被触发。通过将使能判断移入到事件控制里面,使得只有在锁存器输出能够改变的时候事件控制才会被触发。例如:
always @(a or en iff en==1)
y <= a;
l 事件控制中的表达式
Verilog允许在@事件控制列表中使用表达式,例如:
always @((a * b))
always @(memory[address])
在第一个例子中,是当操作数发生改变的时候还是只有当运算结果发生改变的时候才会触发事件控制?在第二个例子中,是当memory的地址发生变化的时候还是只有当memory的值发生变化的时候才会触发事件控制?当@事件控制中包含表达式的时候,IEEE Verilog标准允许仿真器进行不同的优化。这就可能导致在不同的仿真器间有不同的仿真结果,可能还会导致仿真与综合之间的结果不一致。SystemVerilog加入了一个changed关键字,在事件控制列表中它被用作一个修饰符。@(changed (表达式))能够显式地定义只有当表达式的结果发生改变的时候才会触发事件控制。例如:
always @(changed (a * b))
always @(changed memory[address])
l 事件控制中的赋值
Verilog不允许在事件控制中使用赋值。SystemVerilog允许在事件控制中使用赋值表达式。事件控制仅仅敏感于赋值表达式右侧的变化。例如:
always @(y = a * b)
22. 新的过程
Verilog使用always过程来表示时序逻辑、组合逻辑和锁存逻辑的RTL模型。综合工具和其它软件工具必须根据过程起始处的事件控制列表以及过程内的语句来推断always过程的意图。这种推断会导致仿真结果和综合结果之间的不一致。SystemVerilog增加了三个新的过程来显式地指示逻辑的意图。
l always_ff:表示时序逻辑的过程;
l always_comb:表示组合逻辑的过程;
l always_latch:表示锁存逻辑的过程。
例如:
always_comb @(a or b or sel) begin
if (sel) y = a;
else y = b;
end
软件工具能够检查事件控制敏感列表和过程的内容来保证逻辑的功能匹配过程的类型。例如,工具能够检查一个always_comb过程能够敏感过程内读取的所有外部值,对逻辑的每一个分支的相同变量进行赋值,并且检查分支是否覆盖了所有可能的条件。如果任何一个条件没有满足,软件工具均会报告该过程没有正确建模组合逻辑。