Module Verilog模块声明中输入和输出端口的建议顺序

Module Verilog模块声明中输入和输出端口的建议顺序,module,verilog,Module,Verilog,作为Verilog的新手,我注意到很多代码正在订购它们的端口 在先输入的模块声明中: module do_something( input wire clk_in, input wire a_in, input wire b_in, output reg val_out); .... endmodule (几乎和我用C/C++编程时习惯的方式一样:先输入,然后输出) 然而,我也看到了参数顺序相反的示例(输出优先,输入最后) 我希望这不是一个太愚蠢的问题: 是否有

作为Verilog的新手,我注意到很多代码正在订购它们的端口 在先输入的模块声明中:

module do_something(
    input wire clk_in,
    input wire a_in,
    input wire b_in,
    output reg val_out);
....
endmodule
(几乎和我用C/C++编程时习惯的方式一样:先输入,然后输出)

然而,我也看到了参数顺序相反的示例(输出优先,输入最后)

我希望这不是一个太愚蠢的问题:

是否有任何建议/最佳实践选择其中一种?
到目前为止,我只是坚持“先输入”,但我想在养成坏习惯之前先问一下。通常我先做时钟和复位。如果是一个同时进行多个“操作”的大型模块,则后面是按函数分组的IO。在一组中,我通常先对输入进行排序,然后再对输出进行排序,但另一种方式也可以


归根结底,这是风格的问题,所以最重要的是保持一致。选择一种风格并坚持下去。

通常我先做时钟和重置。如果是一个同时进行多个“操作”的大型模块,则后面是按函数分组的IO。在一组中,我通常先对输入进行排序,然后再对输出进行排序,但另一种方式也可以


归根结底,这是风格的问题,所以最重要的是保持一致。选择一种风格并坚持下去。

Verilog内置原语的输出在输入之后。连接模块端口时,应按端口名称而不是位置顺序进行连接,因此顺序并不重要

Verilog内置原语的输出在输入之后。连接模块端口时,应按端口名称而不是位置顺序进行连接,因此顺序并不重要

正如其他人所说,惯例是先放置时钟和重置,然后是其他通用输入,然后是输出

然而,为了个人方便,我喜欢将时钟和重置放在底部,因为这些信号不太可能被修改。这意味着您不必在通过添加/删除端口重构代码时处理尾随的逗号或缺少的逗号。例如:

module example_module(input  wire       clk,
                      input  wire [7:0] a, 
                      input  wire       b,       
                      output wire [7:0] x,            
                      output wire       y 
); 
如果需要在
输出导线y
之后添加另一个输出端口,则必须确保在
y
之后添加逗号。类似地,如果删除了
输出导线y
,则必须确保删除了
x
之后的逗号

这是一件小事,但在您连接、重新排列信号和移动端口时,这是一个累积的不便。然而,如果使用以下命令,则可以添加或删除端口,而不必弄乱尾随的逗号

module example_module(input  wire [7:0] a, 
                      input  wire       b,       
                      output wire [7:0] x,            
                      output wire       y,

                      input  wire       clk    
); 
当你实例化这个模块的时候也是一样的

example_module u__example_module (
     .a  (a),
     .b  (b),
     .x  (x),
     .y  (y),
     .clk(clk)
); 

这是一个主观的答案,但是,嘿,这是一个主观的问题。

正如其他人所说,惯例是先放置时钟和重置,然后是其他通用输入,然后是输出

然而,为了个人方便,我喜欢将时钟和重置放在底部,因为这些信号不太可能被修改。这意味着您不必在通过添加/删除端口重构代码时处理尾随的逗号或缺少的逗号。例如:

module example_module(input  wire       clk,
                      input  wire [7:0] a, 
                      input  wire       b,       
                      output wire [7:0] x,            
                      output wire       y 
); 
如果需要在
输出导线y
之后添加另一个输出端口,则必须确保在
y
之后添加逗号。类似地,如果删除了
输出导线y
,则必须确保删除了
x
之后的逗号

这是一件小事,但在您连接、重新排列信号和移动端口时,这是一个累积的不便。然而,如果使用以下命令,则可以添加或删除端口,而不必弄乱尾随的逗号

module example_module(input  wire [7:0] a, 
                      input  wire       b,       
                      output wire [7:0] x,            
                      output wire       y,

                      input  wire       clk    
); 
当你实例化这个模块的时候也是一样的

example_module u__example_module (
     .a  (a),
     .b  (b),
     .x  (x),
     .y  (y),
     .clk(clk)
); 

这是一个主观的回答,但嘿,这是一个主观的问题。

再详细说明一下。模块在实例化时倾向于(应该总是)使用命名端口,而不是依赖于声明顺序,因此模块中端口的确切顺序不像C中那样重要。事实上,我也是这样做的:首先是时钟和重置,然后是输入和分组相关的I/O。我认为依赖声明顺序会非常糟糕。。。所以我从来没有这样做过。再详细一点。模块在实例化时倾向于(应该总是)使用命名端口,而不是依赖于声明顺序,因此模块中端口的确切顺序不像C中那样重要。事实上,我也是这样做的:首先是时钟和重置,然后是输入和分组相关的I/O。我认为依赖声明顺序会非常糟糕。。。所以我从来没有这么做过。是的。。。这就是我问的原因。到目前为止,我看到的大多数代码(C/C++或Verilog)都是先输入的,我想知道为什么这些内置原语会有不同的做法。它来自早期的一种叫做HILO的语言。内置原语有一个输出端口和可选数量的输入端口。编译器更容易知道第一个端口始终是一个输出。是的。。。这就是我问的原因。到目前为止,我看到的大多数代码(C/C++或Verilog)都是先输入的,我想知道为什么这些内置原语会有不同的做法。它来自早期的一种叫做HILO的语言。内置原语有一个输出端口和可选数量的输入端口。编译器更容易知道第一个端口始终是一个输出。