在Verilog中避免代码重复

时间:2013-03-26 19:43:33

标签: verilog

我发现这在Verilog代码中经常发生:

wire my_module_output_1;
wire my_module_output_2;
wire my_module_output_3;
...

MyModule my_module(
    .output_1(my_module_output_1),
    .output_2(my_module_output_2),
    .output_3(my_module_output_3),
    ...
);

MyOtherModule my_other_module(
    .input_1(my_module_output_1),
    .input_2(my_module_output_2),
    .input_3(my_module_output_3),
    ...
);

希望我能做的是:

MyModule my_module();
MyOtherModule my_other_module(
    .input_1(my_module.output_1),
    .input_2(my_module.output_2),
    .input_3(my_module.output_3),
    ...
);

有没有这样的方法让我达到同样的效果,即避免每当我需要从某个模块连接到某处的输出时一遍又一遍地重复自己?

2 个答案:

答案 0 :(得分:4)

您可以使用以下几种方法来减少重复次数。

起点

这是一个连接两个子模块的简单示例。正如您在问题中所指出的那样,将它们拼接在一起需要大量的重复。

module source(output A, output B);
  assign A = 0;
  assign B = 1;
endmodule

module sink(input A, input B);
  initial begin
    #1 $display("A=%0d B=%0d", A, B);
  end
endmodule

module top();

  wire A;
  wire B;

  source the_source(
    .A(A),
    .B(B)
  );

  sink the_sink(
    .A(A),
    .B(B)
  );

endmodule

使用隐式线

Verilog允许隐式声明电线。因此,如下所示,您无需将AB声明为电线。如果它们出现在端口映射中,则将隐式声明它们。唯一的问题是它们总是被声明为单比特线/网。因此,虽然这对于单比特信号工作正常,但对于总线,仍然需要明确声明互连。

// Verilog, implicit wires
module top();

source the_source(
  .A(A),
  .B(B)
);

sink the_sink(
  .A(A),
  .B(B)
);

endmodule

使用Verilog-Mode AUTOS

Verilog-Mode emacs package可以极大地减少拼接模块所需的打字数量。以下是使用AUTO的上述示例。

在扩展AUTO之前:

// Verilog, explicit connections using AUTOs
module top();

  /*AUTOWIRE*/

  source the_source (/*AUTOINST*/);

  sink the_sink (/*AUTOINST*/);

endmodule

扩展AUTO后:

// Verilog, explicit using AUTOs
module top();

  /*AUTOWIRE*/
  // Beginning of automatic wires (for undeclared instantiated-module outputs)
  wire                A;                      // From the_source of source.v
  wire                B;                      // From the_source of source.v
  // End of automatics

  source the_source (/*AUTOINST*/
                     // Outputs
                     .A               (A),
                     .B               (B));

  sink the_sink (/*AUTOINST*/
                 // Inputs
                 .A                   (A),
                 .B                   (B));

endmodule

正如Brian在他的回答中指出的那样,你不需要使用emacs来使用Verilog-Mode。我也使用Vim并使用this Vim script在Vim中启用Verilog-Mode。


SystemVerilog选项

如果您可以使用SystemVerilog,则可以使用点星符号按名称连接端口。这非常方便,但您仍需要声明对等模块之间互连的连线。

// SystemVerilog, dot-star notation
module top();

  wire A;
  wire B;

  source the_source(.*);
  sink the_sink(.*);

endmodule

答案 1 :(得分:2)

人们到处都没有使用Verilog AUTO吗?

http://www.veripool.org/wiki/verilog-mode/Verilog-mode-Help

特别注意有关AUTOINST的部分。这并不能解决你所有的问题,但明智地使用AUTO会产生大量的结构性Verilog。

不要介意它是Emacs节点。我自己就是一个vim家伙,但是当我需要更新AUTO时,我只是通过emacs管道我的缓冲区加载了这个模式。