为什么输出网络也需要重新声明为“wire”或“reg”?

use*_*096 4 verilog

为什么我们必须采用与输出相同的变量名称,还要连线以获取值?例如:

 module TEST(INP1,INP2,CIN,COUT,SUM);
 input [31:0] INP1;
 input [31:0] INP2;
 output [31:0] SUM;
 input CIN;
 output COUT;

 wire [31:0] SUM;// Again redefined 
 wire COUT; // Again Redefined
 assign {COUT,SUM} = INP1 + INP2 + CIN ;
Run Code Online (Sandbox Code Playgroud)

获取两个数字的进位和总和并将进位作为输入的示例。

Mor*_*gan 5

Verilog 1995确实要求在后面列出端口方向。输出线类型是隐式的,regs 可以与方向内联声明。

module TEST(A,B,C,D);
  input  [31:0] A;
  input  [31:0] B;
  output [31:0] C;
  output        D;

  reg D;
Run Code Online (Sandbox Code Playgroud)

可以写成:

module TEST(A,B,C,D);
  input      [31:0] A;
  input      [31:0] B;
  output     [31:0] C;
  output reg        D; //Only declared twice
Run Code Online (Sandbox Code Playgroud)

Verilog 2001 开始,不再需要额外的定义,它们可以被声明为内联(ANSI 样式)。

module TEST(
  input      [31:0] A,
  input      [31:0] B,
  output     [31:0] C,
  output reg        D  // Declared Once
);
Run Code Online (Sandbox Code Playgroud)

SystemVerilog (2009) 开始,我们有了逻辑类型,您不再需要在 reg 和 wire 类型之间切换。唯一的要求是,如果您需要三态使用线或三。

module TEST(
  input        [31:0] A,
  input        [31:0] B,
  output logic [31:0] C,
  output logic        D
);
Run Code Online (Sandbox Code Playgroud)

我对拥有 reg 和 wire 类型的原始要求的理解是为了仿真速度或仿真器设计的简易性。每个模拟增量周期都会评估导线的值,而仅在由灵敏度列表触发时评估 reg。