移植SystemVerilog风格的时钟分区并驱动到SystemC

时间:2013-01-04 19:57:56

标签: system-verilog systemc

我正在将System Verilog模型移植到SystemC,我不确定模拟这种锁相环时钟驱动方案的最佳方法。在我看来,在SV中驱动时钟是一个手动过程,SystemC为内核提供了一种方法。但我不知道SystemC如何支持在我看的SV模型中手动完成的时钟分割。

考虑这种简化的System Verilog模型。

module device(
    input REFCLKP, // Reference clock, Positive.
    input REFCLKN, // Reference Clock, Negative.
    ...
);
...
    reg  ck;
    reg  ck_x2;
    reg  ck_x3;
    wire refclk = REFCLKP & ~REFCLKN;
    int unsigned ck_ratio = 10; // divide the reference clock by 10
...
    always @(posedge refclk) begin
        tm_refclk_period = $time - tm_refclk;
        tm_refclk <= $time;
        if (tm_refclk_period) begin
            for (int i=0; i<ck_ratio; i++) begin
                ck <= #(i*tm_refclk_period/ck_ratio) refclk;
                ck <= #((i+0.5)*tm_refclk_period/ck_ratio) !refclk;
            end
            for (int i=0; i<ck_ratio/2; i++) begin
                ck_x2 <= #(i*tm_refclk_period/(ck_ratio/2)) refclk;
                ck_x2 <= #((i+0.5)*tm_refclk_period/(ck_ratio/2)) !refclk;
            end
            for (int i=0; i<ck_ratio/3; i++) begin
                ck_x3 <= #(i*tm_refclk_period/(ck_ratio/3)) refclk;
                ck_x3 <= #((i+0.5)*tm_refclk_period/(ck_ratio/3)) !refclk;
            end
        end
    end
...
endmodule

然后,在测试台中:

initial begin
    ...
    // start the clock
    refclk <= #(1e6/rl_ck_mhz) 1'b1;
    forever begin
        @(posedge refclk) begin
            refclk <= #(0.5e6/rl_ck_mhz) 1'b0;
            refclk <= #(1e6/rl_ck_mhz) 1'b1;
        end
    end
end

device dut(
    .REFCLKP(refclk),
    .REFCLKN(!refclk),
    ...);

所以我的SystemC等效的测试平台基本上就像

int sc_main(int argc, char* argv[])
{
    sc_clock refclk;
    ...
    device dut;
    dut.refclk(refclk);
    ...
}

但现在我对如何正确建模从参考时钟驱动的内部时钟感到困惑。我想我可以尝试像SV代码一样进行手动操作,但这似乎不像SystemC方式。我的另一个想法是尝试将所有时钟直接从sc_main驱动,而不是在示例的PLL风格中,但我没有经验可以确定它是否可行。在SystemC中有没有做过类似事情的约定?

0 个答案:

没有答案