• Design Compiler工具学习笔记(3)




    目录

    引言

    知识储备

    时钟创建

    时钟偏差 

     时钟延迟

     转换时间

     输入路径约束

     输出路径延迟

     组合逻辑路径约束

    时间预算

     寄存器输出

    总结

    实际操作

    设计文件

    check_design

    reset_design

    时序约束

    check_timing

    compile

    report_constraint -all_violators

    remove_design -hierarchy

    TCL脚本文件

    dcprocheck

    source ../script/MY_TOP.tcl

    查看时序报告





    引言

    本篇继续学习 DC的基本使用。本篇主要学习 DC 需要的时序约束。

    前文链接:

    Design Compiler工具学习笔记(1)

    Design Compiler工具学习笔记(2)



    知识储备

    时钟创建

    时钟偏差 

     时钟延迟

     转换时间

     输入路径约束

     输出路径延迟

     组合逻辑路径约束

     指定输入延迟、输出延迟,以及时钟周期,可以得到中间组合逻辑 F 的延迟不超过

    时钟周期-输入延迟-输出延迟

     纯组合逻辑,需要创建虚拟时钟,

    时间预算

     寄存器输出

    总结



    实际操作

    写了一个很简单的设计文件:

    设计文件

    顶层:

    1. // ================== TOP module =======================================
    2. // Date:2022-11-20
    3. // By:Xu Y. B.
    4. // Description:
    5. // use I_CNT_CTRL_A signal's posedge to control the counter in the time
    6. // domain B to count .
    7. // =====================================================================
    8. module TOP (
    9. // time domain A 100MHz
    10. input I_CNT_CTRL_A, // input signal that needs to be synchronized
    11. // time domain B 50MHz
    12. input I_CLK_B, // clock B 50MHz
    13. input I_RSTN_B, // synchronous reset active low
    14. // output
    15. output reg [3:0]O_SYNC_DATA_B // output counter
    16. );
    17. // internal signals
    18. wire W_SYNC_CTRL_B; // I_CNT_CTRL_A synchronize to time domain B
    19. reg R_W_SYNC_CTRL_B_R1; // W_SYNC_CTRL_B register one clock
    20. wire W_SYNC_CTRL_B_PDG; // posedge of W_SYNC_CTRL_B
    21. // module logic
    22. always @ (posedge I_CLK_B)
    23. begin:register
    24. if(~I_RSTN_B)
    25. begin
    26. R_W_SYNC_CTRL_B_R1 <= 0;
    27. end
    28. else
    29. begin
    30. R_W_SYNC_CTRL_B_R1 <= W_SYNC_CTRL_B;
    31. end
    32. end
    33. assign W_SYNC_CTRL_B_PDG = W_SYNC_CTRL_B & (~R_W_SYNC_CTRL_B_R1);
    34. // count
    35. always @ (posedge I_CLK_B)
    36. begin:count_B
    37. if(~I_RSTN_B)
    38. begin
    39. O_SYNC_DATA_B <= 4'd0;
    40. end
    41. else
    42. begin
    43. if(W_SYNC_CTRL_B_PDG)
    44. begin
    45. O_SYNC_DATA_B <= 3'd0;
    46. end
    47. else if(&O_SYNC_DATA_B)
    48. begin
    49. O_SYNC_DATA_B <= O_SYNC_DATA_B;
    50. end
    51. else
    52. begin
    53. O_SYNC_DATA_B <= O_SYNC_DATA_B + 1;
    54. end
    55. end
    56. end
    57. // module instantiate
    58. sync_2 INST_sync_2 (.I_CLK(I_CLK_B), .I_RSTN(I_RSTN_B), .I_DATA(I_CNT_CTRL_A), .O_SYNC_DATA(W_SYNC_CTRL_B));
    59. endmodule

    sync_2:

    1. // ================== single-bit signal two stages synchronizer =================
    2. // Date:2022-11-20
    3. // By:Xu Y. B.
    4. // ==============================================================================
    5. module sync_2 (
    6. input I_CLK, // clock
    7. input I_RSTN, // synchronous reset active low
    8. input I_DATA, // input signal that needs to be synchronized
    9. output O_SYNC_DATA // output signal that has been synchronized
    10. );
    11. reg [1:0] R_SYNC;
    12. always @ (posedge I_CLK)
    13. begin:sync
    14. if(~I_RSTN)
    15. begin
    16. R_SYNC <= 2'b00;
    17. end
    18. else
    19. begin
    20. R_SYNC[0] <= I_DATA;
    21. R_SYNC[1] <= R_SYNC[0];
    22. end
    23. end
    24. assign O_SYNC_DATA = R_SYNC[1];
    25. endmodule

    首先按照上篇文章的流程读取设计文件,并且做库的链接。

    然后进行后续操作:

    check_design

     返回 1 表示正确可用。

    reset_design

     返回 1 ,表示正确操作。目的是将涉及置于初始状态,去除一切约束。

    时序约束

    此处的约束种类比较多,后面会在 tcl 脚本里面详细阐述。

    check_timing

    主要用来检查时序约束的完整性。

    compile

    此步骤完成设计的编译即网表映射。

    report_constraint -all_violators

    查看时序违规

    remove_design -hierarchy

    将设计全部移除。

    TCL脚本文件

    1. # |===========================================================
    2. # | Author : Xu Y. B.
    3. # | Date : 2022-11-21
    4. # | Description : tcl script for top design
    5. # |===========================================================
    6. # |===========================================================
    7. # |STEP 1: Read & elaborate the RTL design file list & check
    8. # |===========================================================
    9. set TOP_MODULE TOP
    10. analyze -format verilog [list TOP.v sync_2.v]
    11. elaborate $TOP_MODULE -architecture verilog
    12. current_design $TOP_MODULE
    13. if {[link] == 0} {
    14. echo "Your Link has errors !";
    15. exit;
    16. }
    17. if {[check_design] == 0} {
    18. echo "Your check design has errors !";
    19. exit;
    20. }
    21. # |===========================================================
    22. # |STEP 2: reset design
    23. # |===========================================================
    24. reset_design
    25. # |===========================================================
    26. # |STEP 3: Write unmapped ddc file
    27. # |===========================================================
    28. uniquify
    29. set uniquify_naming_style "%s_%d"
    30. write -f ddc -hierarchy -output ${UNMAPPED_PATH}/${TOP_MODULE}.ddc
    31. # |===========================================================
    32. # |STEP 4: define clocks
    33. # |===========================================================
    34. set CLK_NAME I_CLK_B
    35. set CLK_PERIOD 20
    36. set CLK_SKEW [expr {$CLK_PERIOD*0.05}]
    37. set CLK_TRANS [expr {$CLK_PERIOD*0.01}]
    38. set CLK_SRC_LATENCY [expr {$CLK_PERIOD*0.1 }]
    39. set CLK_LATENCY [expr {$CLK_PERIOD*0.1 }]
    40. create_clock -period $CLK_PERIOD [get_ports $CLK_NAME]
    41. set_ideal_network [get_ports $CLK_NAME]
    42. set_dont_touch_network [get_ports $CLK_NAME]
    43. set_drive 0 [get_ports $CLK_NAME]
    44. set_clock_uncertainty -setup $CLK_SKEW [get_clocks $CLK_NAME]
    45. set_clock_transition -max $CLK_TRANS [get_clocks $CLK_NAME]
    46. set_clock_latency -source -max $CLK_SRC_LATENCY [get_clocks $CLK_NAME]
    47. set_clock_latency -max $CLK_LATENCY [get_clocks $CLK_NAME]
    48. # |===========================================================
    49. # |STEP 5: define reset
    50. # |===========================================================
    51. set RST_NAME I_RSTN_B
    52. set_ideal_network [get_ports $RST_NAME]
    53. set_dont_touch_network [get_ports $RST_NAME]
    54. set_drive 0 [get_ports $RST_NAME]
    55. # |===========================================================
    56. # |STEP 6: set input delay using timing budget
    57. # |Assume a weak cell to drive the input pins
    58. # |===========================================================
    59. set LIB_NAME typical
    60. set WIRE_LOAD_MODULE smic18_wl10
    61. set DRIVE_CELL INVX1
    62. set DRIVE_PIN Y
    63. set OPERATE_CONDITION typical
    64. set ALL_INPUT_EXCEPT_CLK [remove_from_collection [all_inputs] [get_ports "$CLK_NAME"]]
    65. set INPUT_DELAY [expr {$CLK_PERIOD*0.6}]
    66. set_input_delay $INPUT_DELAY -clock $CLK_NAME $ALL_INPUT_EXCEPT_CLK
    67. # set_input_delay -min 0 -clock $CLK_NAME $ALL_INPUT_EXCEPT_CLK
    68. set_driving_cell -lib_cell ${DRIVE_CELL} -pin ${DRIVE_PIN} $ALL_INPUT_EXCEPT_CLK
    69. # |===========================================================
    70. # |STEP 7: set output delay
    71. # |===========================================================
    72. set output_DELAY [expr {$CLK_PERIOD*0.6}]
    73. set MAX_LOAD [expr {[load_of $LIB_NAME/INVX8/A] * 10}]
    74. set_output_delay $output_DELAY -clock $CLK_NAME [all_outputs]
    75. set_load [expr {$MAX_LOAD * 3}] [all_outputs]
    76. set_isolate_ports -type buffer [all_outputs]
    77. # |===========================================================
    78. # |STEP 8: set max delay for comb logic
    79. # |===========================================================
    80. # set_input_delay [expr $CLK_PERIOD * 0.1] -clock $CLK_NAME -add_delay [get_ports I_1]
    81. # set_output_delay [expr $CLK_PERIOD * 0.1] -clock $CLK_NAME -add_delay [get_ports O_1]
    82. # |===========================================================
    83. # |STEP 9: set operating condition & wire load model
    84. # |===========================================================
    85. set_operating_conditions -max $OPERATE_CONDITION \
    86. -max_library $LIB_NAME
    87. set auto_wire_load_selection false

    dcprocheck

    检查 tcl 脚本有无语法问题。

    故意打错一个命令:

     出现了未定义程序的警告需要重视。

    source ../script/MY_TOP.tcl

    执行脚本,注意路径。

    可以检查约束:check_timing;

    执行编译:compile

    查看时序报告

  • 相关阅读:
    【uniapp+vue3/vue2】ksp-cropper高性能图片裁剪工具,详解
    IT专业入门,高考假期预习指南
    2.【远程调用框架】Feign远程调用
    TempleteMethod
    leetcode1036. 逃离大迷宫(java)
    asyncawait和promise的区别
    Matlab 用法
    JavaScript解构赋值介绍
    【算法|动态规划No.19】leetcode413. 等差数列划分
    全局异常处理器
  • 原文地址:https://blog.csdn.net/qq_43045275/article/details/127955457