Verilog语言中reg变量和wire变量的问题
时间:10-02
整理:3721RD
点击:
最近在看一些书籍上的Verilog代码时,发现一个小问题,如下。如果一个module的某个输出端口需要在always块中赋值,很多代码的做法是将该信号定义为wire类型,而同时在程序中再定义一个对应的reg型变量,在always模块中对后面这个定义的reg型变量赋值,而使用assign将reg型变量的值赋给输出端口。
举例如下:
module tx
(
input clk,
input rst_n,
output txd
...
);
reg txd_reg;
...
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
txd_reg <= 1'b1;
...
end
else begin
...
end
end
assign txd = txd_reg
...
endmodule
请问,这样处理有什么优点呢?为什么不将需要赋值的输出端口直接定义为reg型变量,在always块中直接对其赋值呢?
有意思,我也想知道為什麼?
请教了一个同事,他给出的解释如下,贴出来供大家参考和讨论:
这种代码风格常见于对FPGA代码的编写过程中,目的是为了更好的利用FPGA的资源。
如果将输出端口直接定义为reg型变量,在FPGA在综合时会将该变量映射到output register上;
如果按照上面给出的例子,将输出端口定义为默认的wire型,而是在代码中重新定义一个reg型变量,那么output pin只是一根线,而reg型变量则是使用了FPGA内部的逻辑资源。
不明觉厉啊
学习学习
最近在看跨时钟域的数据传输,在一个时钟域中输出一般都要进过寄存器打一拍,这样是数据的宽度至少为本时钟域的一个时钟宽度。这是不是也是一个原因呢?
为了不使用output register?
没有区别。
综合结果无区别,个人喜好不同。
习惯用VHDL的就看看。
好像有点明白了
好东西,谢谢分享