如何在系统 verilog 中驱动来自 2 个源的信号
How do I drive a signal from 2 sources in system verilog
我正在尝试编写一个 RTL 模型,在其中监视独立的时钟源。这些时钟源可以具有可变频率(范围 5 到 50MHz)
假设clk1和clk2。我正在尝试驱动一个信号 'toggle',它在 clk1 的每个位置都设置为“1”,在 clk2 的每个位置都设置为“0”。我在实现这个模型时遇到了问题。
我尝试使用 1 个触发器在 clk1 的上升沿触发,该触发器的输入连接到 'high',另一个触发器在 clk2 的下降沿触发,输入连接到 'low'。我将这些输出发送到多路复用器,但我无法弄清楚如何驱动该多路复用器
的 select 信号
这是我的代码片段:
always_ff @(posedge clk1 or rstb) begin
if(!rstb) begin
flop1_out <= 0;
end else begin
flop1_out <= 1;
end
end
always_ff @(negedge clk2) begin
flop2_out <= 0;
end
assign toggle = sel ? flop1 : flop2;
所以,到目前为止,没有任何东西在驱动 sel 并且试图弄清楚这是我遇到麻烦的地方
如果我尝试从 2 个不同的时钟源驱动相同的信号(切换),我会收到一条错误消息,指出找到了多个用于信号切换的驱动程序,这是有道理的。
如果您有任何建议,请告诉我
编辑:修复了一个拼写错误并从 flop2 的敏感列表中删除了 rstb
assign rstn = clk2;
always @ (posedge clk1 or negedge rstn)
if (~rstn)
toggle = 1'b0;
else
toggle <= 1'b1;
注意:根据时钟频率和插入延迟关系,该电路可能会变得亚稳态。如果您可以忍受延迟,请在输出端添加一个同步器。更好的是,如果您可以容忍失真,请在 clk2 和 clk1mx 上添加一个复位同步器,其中 clk1mx 与 clock1 同步,但快 x 倍。
我正在尝试编写一个 RTL 模型,在其中监视独立的时钟源。这些时钟源可以具有可变频率(范围 5 到 50MHz)
假设clk1和clk2。我正在尝试驱动一个信号 'toggle',它在 clk1 的每个位置都设置为“1”,在 clk2 的每个位置都设置为“0”。我在实现这个模型时遇到了问题。
我尝试使用 1 个触发器在 clk1 的上升沿触发,该触发器的输入连接到 'high',另一个触发器在 clk2 的下降沿触发,输入连接到 'low'。我将这些输出发送到多路复用器,但我无法弄清楚如何驱动该多路复用器
的 select 信号这是我的代码片段:
always_ff @(posedge clk1 or rstb) begin
if(!rstb) begin
flop1_out <= 0;
end else begin
flop1_out <= 1;
end
end
always_ff @(negedge clk2) begin
flop2_out <= 0;
end
assign toggle = sel ? flop1 : flop2;
所以,到目前为止,没有任何东西在驱动 sel 并且试图弄清楚这是我遇到麻烦的地方
如果我尝试从 2 个不同的时钟源驱动相同的信号(切换),我会收到一条错误消息,指出找到了多个用于信号切换的驱动程序,这是有道理的。
如果您有任何建议,请告诉我
编辑:修复了一个拼写错误并从 flop2 的敏感列表中删除了 rstb
assign rstn = clk2;
always @ (posedge clk1 or negedge rstn)
if (~rstn)
toggle = 1'b0;
else
toggle <= 1'b1;
注意:根据时钟频率和插入延迟关系,该电路可能会变得亚稳态。如果您可以忍受延迟,请在输出端添加一个同步器。更好的是,如果您可以容忍失真,请在 clk2 和 clk1mx 上添加一个复位同步器,其中 clk1mx 与 clock1 同步,但快 x 倍。