【芯片前端】为什么在设置sdc时引入和使用虚拟时钟

关于SDC最近还在死磕这本书,有点感悟:

借着这本书里的只是,聊一下sdc中的虚拟时钟。

构造一个场景,我们有一个模块用来模拟ram的行为,其代码如下:

module dual_port_RAM #(parameter DEPTH = 16,

                                      parameter WIDTH = 8)(

        input wclk

       ,input wenc

       ,input [$clog2(DEPTH)-1:0] waddr  //深度对2取对数,得到地址的位宽。

       ,input [WIDTH-1:0] wdata             //数据写入

       ,input rclk

       ,input renc

       ,input [$clog2(DEPTH)-1:0] raddr  //深度对2取对数,得到地址的位宽。

       ,output reg [WIDTH-1:0] rdata          //数据输出

);

reg [WIDTH-1:0] RAM_MEM [0:DEPTH-1];

always @(posedge wclk) begin

       if(wenc)

              RAM_MEM[waddr] <= wdata;

end

always @(posedge rclk) begin

       if(renc)

              rdata <= RAM_MEM[raddr];

end

endmodule

从接口上我们可以看到,模块内有两个时钟域wclk和rclk,在sdc中我们必然会创建这两个时钟:

set R_CLK rclk

set W_CLK wclk

creat_clock -period 10 -name $R_CLK [get_ports rclk] -add

creat_clock -period 20 -name $W_CLK [get_ports wclk] -add

把模块内的时钟设置好后,模块内部的逻辑和寄存器的时钟域问题就不用我们担心了,DC工具会自动进行推导。那么问题就出现了,对于接口上的信号,DC工具是没有办法进行完整的推导的,比如说接口上的wdata,DC工具在综合dual_port_RAM这个模块的时候,只是知道这个信号的走线终点在wclk时钟域,但是他的走线起点呢?DC工具无法推导,那么就需要我们手动来告诉工具:wdata也是wclk时钟域的。不仅要告诉工具wdata属于wclk时钟域,还要告诉工具这个信号的输入延迟是多大,毕竟工具看不到模块外的情况,无法推导这条路径的时序。

因此我们要做一件什么事呢?就是创建一个模块外部的时钟v_wclk,将wdata约束在这个时钟域下并设置好input_delay/output_delay,然后告诉工具v_wclk和wclk是同一个时钟,请进行同步检查。

不过既然知道了wdata信号是由wclk触发的,那么直接约束在wclk时钟域下是不是可以呢?对于顶层或不需要考虑集成需求的小模块我总觉得是可以的,毕竟我自己虚拟机里的测试环境我就直接约在了真实时钟下。但是对于有集成需求的模块,约束在真实时钟下集成后会不会引起其他的问题确实没有思考出来,我也没这么干过,有时间试一试(总觉得好像也没事,毕竟模块sdc定义的真实时钟和虚拟时钟都不会被带到上层模块sdc去)。

带着这个疑问,记录下我自己的思考:
1.“直接将接口约束在真实时钟”,是“约束在虚拟时钟而后绑定虚拟时钟和真实时钟”的子集;
2.在做子系统级的约束,或者通常可见的场景下二者没有区别;
3.从工具的角度,后者更加接近客观事实,同时更加灵活;
4.还是从工具的角度,工具本身就不可见模块外的时钟和路径时序信息,借助虚拟时钟再根据情况将虚拟时钟与真实时钟源绑定是合理的思路。

同时带着这几个疑问我问了下大佬,得到的答复是:
1.“直接将接口约束在真实时钟”在综合模块或者子系统时完全可行,行为和“约束在虚拟时钟而后绑定虚拟时钟和真实时钟”一致;
2.虚拟时钟在后端处理时会有所区别,细节不详需要再去和后端聊聊;
3.在芯片顶层真正的pin级别时,输出输出本身就不是同一个时钟了,这个时候就乖乖的约束在虚拟时钟,不管DC到低查不查;
4.不要想太多,按业内规范来吧。

结论呢就是,外部的时钟DC工具是看不到的也可以视为不存在的,那么使用虚拟时钟很合理,书上的做法和工作中的实操都是引入虚拟时钟。根据书上的描述给虚拟时钟一个定义:虚拟时钟是指物理上在特定电路单元中不存在的时钟,但它表示影响该电路单元的外部触发器。虚拟时钟没有指定的时钟源。实际上虚拟时钟可能有时钟源,不过该时钟源约束在电路单元的外部。

那么如何设置虚拟时钟呢,就是用creat_clock,但是虚拟时钟没有时钟源:

creat_clock -period 10 -name v_$R_CLK -add

creat_clock -period 20 -name v_$W_CLK -add

那么最后要做的一步事情就很简单了,告诉工具v_wclk和wclk时钟域是一个,在他们之间做同步时序检查,换句话说就是给时钟分组:

set_clock_groups -name clk_group -asynchronous \

-group [list $R_CLK v_$R_CLK] \

-group [list $W_CLK v_$W_CLK]

当然后面还要对虚拟时钟域设置input_delay/output_delay,那就是另外一件事情了。

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼德兰的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值