|
 |
Verilog小知识 |
|
|
|
|
用数据流描述方式对一个设计建模的最基本的机制就是使用连续赋值语句。在连续赋值语句中,某个值被指派给线网变量。 连续赋值语句的语法为:
assign [delay] LHS_net = RHS_ expression;
右边表达式使用的操作数无论何时发生变化 , 右边表达式都重新计算, 并且在指定的时延后变化值被赋予左边表达式的线网变量。时延定义了右边表达式操作数变化与赋值给左边表达式之间的持续时间。如果没有定义时延值 , 缺省时延为 0 。
下面的例子显示了使用数据流描述方式对解码器电路的建模的实例模型。
`timescale 1ns/ 1ns
module Decoder2x4 (A, B, EN, Z);
input A, B, EN;
output [ 0 :3] Z;
wire Abar, Bbar;
assign #1 Abar = ~ A; / / 语句 1 。
assign #1 Bbar = ~ B; / / 语句 2 。
assign #2 Z[0] = ~ (Abar & Bbar & EN) ; / / 语句 3 。
assign #2 Z[1] = ~ (Abar & B & EN) ; / / 语句 4 。
assign #2 Z[2] = ~ (A & Bbar & EN) ; / / 语句 5 。
assign #2 Z[3] = ~ (A & B & EN) ; / / 语句 6 。
endmodule
以反引号 “ ` ” 开始的第一条语句是编译器指令 , 编译器指令 `timescale 将模块中所有时延的单位设置为 1 ns ,时间精度为 1 ns 。例如,在连续赋值语句中时延值 #1 和 #2 分别对应时延 1 ns 和 2 ns 。
模块 Decoder2x4 有 3 个输入端口和 1 个 4 位输出端口。线网类型说明了两个连线型变量 Abar 和 Bbar ( 连线类型是线网类型的一种 ) 。此外,模块包含 6 个连续赋值语句。
当 EN 在第 5 ns 变化时 , 语句 3 、 4 、 5 和 6 执行。这是因为 EN 是这些连续赋值语句中右边表达式的操作数。 Z[0] 在第 7 ns 时被赋予新值 0 。当 A 在第 15 ns 变化时 , 语句 1 、 5 和 6 执行。执行语句 5 和 6 不影响 Z[0] 和 Z[1] 的取值。执行语句 5 导致 Z[2] 值在第 17 ns 变为 0 。执行语句 1 导致 Abar 在第 16 ns 被重新赋值。由于 Abar 的改变,反过来又导致 Z[0] 值在第 18 ns 变为 1 。
请注意连续赋值语句是如何对电路的数据流行为建模的;这种建模方式是隐式而非显式的建模方式。此外 , 连续赋值语句是并发执行的,也就是说各语句的执行顺序与其在描述中出现的顺序无关。
|
|