4

为什么我们必须采用与输出相同的变量名并连线来获取值?例如:

 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 ;

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

4

3 回答 3

4

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;

可以写成:

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

Verilog 2001以来,不再需要额外的定义,并且可以将它们声明为内联(ANSI 样式)。

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

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

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

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

于 2012-09-03T23:18:34.180 回答
4

没有必要将 anoutput也声明为wire。此外,您可以通过使用 ANSI 风格的端口声明来避免重复端口列表:

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

    assign {COUT,SUM} = INP1 + INP2 + CIN ;
endmodule

在您的示例中,您不需要将输出声明为reg. 但是,如果您需要另一个电路,您可以在同一行声明类型,例如:

output reg [31:0] Q;
于 2012-09-02T02:03:37.817 回答
-1

因为仅将网络声明为output并不能描述它是reg类型还是wire类型。

输出可以由电线或 reg 驱动,您必须告诉它驱动程序将是什么类型。

于 2012-09-01T20:45:50.403 回答