wire 元素(组合逻辑)

wire 元素是 Verilog 设计中的简单导线(或任意宽度的总线)。以下是使用 wire 时的语法规则:

  1. wire 元素用于将模块实例化的 inputoutput 端口与设计中的某些其他元素连接在一起。
  2. wire 元素在实际模块中被用来声明 inputoutput
  3. wire 元素必须由某种东西驱动,并且不被驱动就不能存储值。
  4. wire 元素不能在 always@ 块中 =<= 的左侧。
  5. wire 元素是 assign 语句左侧唯一合法类型。
  6. wire 元素是基于 Verilog 的设计中连接两个零件的无状态方式。
  7. wire 元素只能用于组合逻辑的建模。

程序 1 显示了 wire 的合法使用

程序 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
wire        A, B, C, D, E;  // 1 bit 宽度的 wire
wire [8:0] Wide; // 9 bits 宽度的 wire
reg I;

assign A = B & C; // 使用带有 assign 的 wire

always @ (B or C) begin
I = B | C; // 使用 wire 在 always 的右侧
end

mymoudule mymodule_instance (
.In (D),
.Out(E) // 使用 wire 在模块的 output
)

reg 元素(组合逻辑与时序逻辑)

reg 元素和 wire 很像,但是能够用来存储信息(状态)像寄存器一样。reg 元素的语法规则如下:

  1. reg 元素能够被连接到模块实例的 input 端口
  2. reg 元素不能被连接到模块实例的 output 端口
  3. reg 元素能够被使用在实际模块声明中的 output
  4. reg 元素不能被使用在实际模块声明中的 input
  5. regalways @ 块中 =<= 左侧唯一的合法类型
  6. reginitial 块中 = 左侧唯一的合法类型(用于 Test Benches)
  7. reg 不能用于 assign 语句的左侧
  8. regalways @ (posedge Clock) 块一起使用时,可用于创建寄存器
  9. reg 因此可用于创建组合逻辑和时序逻辑。

程序 2 显示了 reg 元素的合法使用

程序 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wire        A, B;
reg I, J, K; // 1 bit 宽度的 reg
reg [8:0] Wide; // 9 bits 宽度的 reg

always @ (A or B) begin
I = A | B // 在 always 块的左侧使用 reg
end

initial begin
J = 1'b1; // 在 initial 块中使用 reg
# 1
J = 1'b0;
end

always @ (posedge Clock) begin
K <= I; // 使用 reg 来创建一个上升沿触发的寄存器
end

什么时候 wire 与 reg 可以互换?

在这些情况下,wirereg 可以互换使用:

  1. 两者都可以出现在 assign 语句和 always @ 语句的 =<= 符号的右侧。
  2. 两者都可以被连接到模块实例的 input 端口

原文

http://inst.eecs.berkeley.edu/~cs150/Documents/Nets.pdf