如何在系统 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 倍。