参数化寄存器的有效边沿

时间:2017-02-17 21:46:43

标签: verilog

我想知道是否有一种简单的方法来定义模块的活动边缘,例如一个寄存器,在Verilog中,所以我可以定义在实例化时是否为正/负触发。例如:

Register #(.width(8), .active_edge(`POS_EDGE)) DUT ();

这是我的尝试,但是,我不知道在posedge变量中使用逻辑运算符是否合法:

module Register #(
    parameter width=8,
    parameter active_edge=1'b1) (
    input      [width-1:0] D,
    input                  clk, rst, we,
    output reg [width-1:0] Q);

    always @(posedge active_edge^~clk, posedge rst) begin
        if (rst)
            Q <= 'b0;
        else
            if (we) Q <= D;
    end

endmodule

1 个答案:

答案 0 :(得分:0)

你写的是合法的Verilog,但是一些综合工具可能不接受时钟的复杂表达式。您可以编写一个中间表达式,它将被优化掉。

module Register #(
    parameter width=8,
    parameter active_edge=1'b1) (
    input      [width-1:0] D,
    input                  clk, rst, we,
    output reg [width-1:0] Q);
    wire local_clk = active_edge ? !clk : clk;
    always @(posedge local_clock, posedge rst) begin
        if (rst)
            Q <= 'b0;
        else
            if (we) Q <= D;
    end

endmodule