微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > Verilog语言中reg变量和wire变量的问题

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的就看看。

好像有点明白了

好东西,谢谢分享

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top