Module Verilog模块声明中输入和输出端口的建议顺序
作为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++编程时习惯的方式一样:先输入,然后输出) 然而,我也看到了参数顺序相反的示例(输出优先,输入最后) 我希望这不是一个太愚蠢的问题: 是否有
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的语言。内置原语有一个输出端口和可选数量的输入端口。编译器更容易知道第一个端口始终是一个输出。