SV中Clock的处理

问题: 如何实现某个范围内的clock的随机化

难点: # 后面必须跟常量。

解决方法:

   1) 如果clock是某些特定频率,那么构造这些特定频率的virtual clock,并通过变量选择相应频率的virtual clock,作为phiscal clock.

 

          具体如下:

=================env.sv====================

virtual task start(); ... start_clock(); endtask task start_clock(); fork begin while(1) begin if(clk_sel==CLK10M) begin // virtula 10M #(50) tb_mp.clk<=1'b0; #(50) tb_mp.clk<=1'b1; end else if(clk_sel==CLK20M) begin // virtual 20M #(25) tb_mp.clk<=1'b0; #(25) tb_mp.clk<=1'b1; end end end join_none endtask   

 

       

======================interface.sv=======================

          此外,由于testbench生成了clk,并且作为各个xactor的输入,所以必须在interface里面定义一个clk的输出的modport,以及clk输入的modport. 同理reset,也应如此。只不过一般clk是异步的,reset是同步于clk的。

wire aclk; modport clkgen_mp(output aclk, import reset_block.*) modport mstr_port(import clk_block.*, import master_clocking_block.*); clocking clk_block @(aclk); default input #0; input aclk; endclocking : clk_block

         

 

 

   2) 如果clock是一个随机范围,那么要生成一个timescale范围内的virtual clock. 然后采取repeat(var)  @(virtual_clock)的方法间接构建clock。

 

 

Note:

        如果系统中只有一个clock,那么我们可以指定xxx为default clock. 这样就可以用 ##var  来代替  repeat(var) @(posedge xxx)语法如下:

 

          default clocking default_clk @(posedge axi_if_1.clk_block.aclk);
          endclocking : default_clk

你可能感兴趣的:(SystemVerilog)