我想知道是否有一种简单的方法来定义模块的活动边缘,例如一个寄存器,在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
答案 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