为什么以下时钟乘法Verilog代码对我不起作用?

时间:2018-09-27 04:49:16

标签: verilog system-verilog asic soc

我正在尝试生成一个系统时钟的(3/16)时钟。因此,我决定从系统clk生成一个3x时钟,然后从该时钟生成(1/16)x时钟。 现在,我只能生成3倍时钟。我这样做是通过计算系统时钟的时间周期,然后在该周期的1/6处切换3x时钟。但是我的模拟将永远停滞不前。我检查过,我没有在任何地方使用forever块。因此,没有时序构造。 以下是我正在处理的代码。

module eec_clk_gen (
    input logic arst,
    input logic sys_clk,
    output logic eec_clk
);

real t0;
real t1;
real sys_clk_tp;


logic eec_clk_x3;


//Calculating clock period of sys_clk
initial
begin
    @(posedge sys_clk) t0 = $realtime;
    @(posedge sys_clk) t1 = $realtime;
    sys_clk_tp = t1 - t0;
end



//Generating clock at 3 times sys_clk freq

initial
begin
    @(posedge sys_clk) eec_clk_x3 = 1'b1;
end

always
begin
    #(sys_clk_tp/6) eec_clk_x3 <= ~eec_clk_x3;
end

endmodule: eec_clk_gen

我不关心我的代码中缺少的arst信号。 eec_clk可以正常运行。 请帮忙吗?

2 个答案:

答案 0 :(得分:1)

您的代码有2个,可能是3个问题。

  1. sys_clk_tp的初始值为 0.0 。因此,您的always块会进入无限0延迟循环。时间不能提前
  2. 您正在使用对t1,t2的非阻塞分配,因此在评估t1-t2时t2仍为0
  3. 您使用的是$time而不是$realtime。如果由于不同的时标,您的输入时钟有任何小数延迟,则$ time将被截断。 我会做的

`

initial
     begin
        @(posedge sys_clk) t0 = $realtime;
        @(posedge sys_clk) t1 = $realtime;
        sys_clk_tp = t1 - t0;
        forever  #(sys_clk_tp/6) eec_clk_x3 = ~eec_clk_x3;
    end

答案 1 :(得分:0)

您试图做的是徒劳的。即使您设法使其在仿真中正常工作,它也不会合成:

  • $realtime函数仅在仿真中可用。它不能用于综合;如果需要实时时钟,则需要自己制作。

  • #运算符仅在仿真中有效。在合成过程中会被忽略。

如果要在FPGA上倍增时钟信号,大多数FPGA都有时钟管理硬宏(通常是DLL或PLL),可用于此目的。有关详细信息,请查阅目标零件的参考手册。

如果您要定位ASIC,请与您的代工厂联系。