OpenCores
URL https://opencores.org/ocsvn/yifive/yifive/trunk

Subversion Repositories yifive

[/] [yifive/] [trunk/] [caravel_yifive/] [verilog/] [rtl/] [syntacore/] [scr1/] [synth/] [synth.tcl] - Blame information for rev 11

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 dinesha
# Copyright 2020 Efabless Corporation
2
#
3
# Licensed under the Apache License, Version 2.0 (the "License");
4
# you may not use this file except in compliance with the License.
5
# You may obtain a copy of the License at
6
#
7
#      http://www.apache.org/licenses/LICENSE-2.0
8
#
9
# Unless required by applicable law or agreed to in writing, software
10
# distributed under the License is distributed on an "AS IS" BASIS,
11
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
# See the License for the specific language governing permissions and
13
# limitations under the License.
14
 
15
# inputs expected as env vars
16
#set opt $::env(SYNTH_OPT)
17
########### config.tcl ##################
18
# User config
19
 
20
# User config
21
set ::env(DESIGN_DIR) ../
22
 
23
set ::env(PROJ_DIR) ../../../../
24
 
25
# User config
26
set ::env(DESIGN_NAME) scr1_top_wb
27
 
28
# Change if needed
29
set ::env(VERILOG_FILES) [glob  \
30
        ../src/core/pipeline/scr1_pipe_top.sv  \
31
        ../src/core/scr1_core_top.sv  \
32
        ../src/core/scr1_dm.sv  \
33
        ../src/core/scr1_tapc_synchronizer.sv  \
34
        ../src/core/scr1_clk_ctrl.sv  \
35
        ../src/core/scr1_scu.sv  \
36
        ../src/core/scr1_tapc.sv  \
37
        ../src/core/scr1_tapc_shift_reg.sv  \
38
        ../src/core/scr1_dmi.sv  \
39
        ../src/core/primitives/scr1_reset_cells.sv  \
40
        ../src/core/pipeline/scr1_pipe_ifu.sv  \
41
        ../src/core/pipeline/scr1_pipe_idu.sv  \
42
        ../src/core/pipeline/scr1_pipe_exu.sv  \
43
        ../src/core/pipeline/scr1_pipe_mprf.sv  \
44
        ../src/core/pipeline/scr1_pipe_csr.sv  \
45
        ../src/core/pipeline/scr1_pipe_ialu.sv  \
46
        ../src/core/pipeline/scr1_pipe_lsu.sv  \
47
        ../src/core/pipeline/scr1_pipe_hdu.sv  \
48
        ../src/core/pipeline/scr1_pipe_tdu.sv  \
49
        ../src/core/pipeline/scr1_ipic.sv   \
50
        ../src/top/scr1_dmem_router.sv   \
51
        ../src/top/scr1_imem_router.sv   \
52
        ../src/top/scr1_tcm.sv   \
53
        ../src/top/scr1_timer.sv   \
54
        ../src/top/scr1_top_wb.sv   \
55
        ../src/top/scr1_dmem_wb.sv   \
56
        ../src/top/scr1_imem_wb.sv   \
57
        ../../../lib/sync_fifo.sv  ]
58
 
59
#set ::env(VERILOG_FILES_BLACKBOX) [glob  \
60
#            $::env(DESIGN_DIR)/src/top/scr1_dp_memory.sv ]
61
 
62
set ::env(VERILOG_INCLUDE_DIRS) [glob $::env(DESIGN_DIR)/src/includes]
63
 
64
set ::env(SYNTH_DEFINES) [list YOSYS ]
65
#set ::env(SYNTH_DEFINES) [list SCR1_DBG_EN SCR1_MPRF_RAM ]
66
 
67
 
68
set ::env(LIB_SYNTH)  ./tmp/trimmed.lib
69
 
70
 
71
#set ::env(SDC_FILE) "./designs/aes128/src/aes128.sdc"
72
 
73
# Fill this
74
set ::env(CLOCK_PERIOD) "10"
75
set ::env(CLOCK_PORT) "clk"
76
set ::env(CLOCK_TREE_SYNTH) 0
77
 
78
set ::env(RUN_SIMPLE_CTS) 0
79
set ::env(SYNTH_BUFFERING) 0
80
set ::env(SYNTH_SIZING) 0
81
 
82
set ::env(SYNTH_DRIVING_CELL) "sky130_fd_sc_hd__inv_8"
83
set ::env(SYNTH_CAP_LOAD) "17.65"
84
set ::env(SYNTH_MAX_TRAN) "[expr {0.1*10.0}]"
85
 
86
set ::env(SYNTH_MAX_FANOUT) 6
87
set ::env(FP_CORE_UTIL) 50
88
set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ]
89
set ::env(CELL_PAD) 4
90
 
91
set ::env(SYNTH_NO_FLAT) "0"
92
 
93
 
94
set ::env(SYNTH_STRATEGY) "AREA 0"
95
set ::env(SYNTH_TIELO_PORT) "sky130_fd_sc_hd__conb_1 LO"
96
set ::env(SYNTH_TIEHI_PORT) "sky130_fd_sc_hd__conb_1 HI"
97
set ::env(SYNTH_MIN_BUF_PORT) "sky130_fd_sc_hd__buf_2 A X"
98
 
99
 
100
set ::env(CLOCK_NET) $::env(CLOCK_PORT)
101
 
102
 
103
 
104
set ::env(yosys_tmp_file_tag) "./tmp/"
105
set ::env(TMP_DIR) "./tmp/"
106
set ::env(yosys_netlist_dir) "./netlist"
107
set ::env(yosys_report_file_tag) "./reports/yosys"
108
set ::env(yosys_result_file_tag) "./reports/yosys.synthesis"
109
 
110
set ::env(SAVE_NETLIST) $::env(yosys_netlist_dir)/$::env(DESIGN_NAME).gv
111
 
112
 
113
 
114
########### End of config.tcl
115
set buffering $::env(SYNTH_BUFFERING)
116
set sizing $::env(SYNTH_SIZING)
117
 
118
yosys -import
119
 
120
set vtop $::env(DESIGN_NAME)
121
#set sdc_file $::env(SDC_FILE)
122
set sclib $::env(LIB_SYNTH)
123
 
124
if { [info exists ::env(SYNTH_DEFINES) ] } {
125
        foreach define $::env(SYNTH_DEFINES) {
126
                log "Defining $define"
127
                verilog_defines -D$define
128
        }
129
}
130
 
131
set vIdirsArgs ""
132
if {[info exist ::env(VERILOG_INCLUDE_DIRS)]} {
133
        foreach dir $::env(VERILOG_INCLUDE_DIRS) {
134
                log "Adding include file -I$dir "
135
                lappend vIdirsArgs "-I$dir"
136
        }
137
        set vIdirsArgs [join $vIdirsArgs]
138
}
139
 
140
 
141
 
142
if { [info exists ::env(EXTRA_LIBS) ] } {
143
        foreach lib $::env(EXTRA_LIBS) {
144
                read_liberty {*}$vIdirsArgs -lib -ignore_miss_dir -setattr blackbox $lib
145
        }
146
}
147
 
148
 
149
 
150
# ns expected (in sdc as well)
151
set clock_period [expr {$::env(CLOCK_PERIOD)*1000}]
152
 
153
set driver  $::env(SYNTH_DRIVING_CELL)
154
set cload   $::env(SYNTH_CAP_LOAD)
155
# input pin cap of IN_3VX8
156
set max_FO $::env(SYNTH_MAX_FANOUT)
157
if {![info exist ::env(SYNTH_MAX_TRAN)]} {
158
        set ::env(SYNTH_MAX_TRAN) [expr {0.1*$clock_period}]
159
} else {
160
        set ::env(SYNTH_MAX_TRAN) [expr {$::env(SYNTH_MAX_TRAN) * 1000}]
161
}
162
set max_Tran $::env(SYNTH_MAX_TRAN)
163
 
164
 
165
# Mapping parameters
166
set A_factor  0.00
167
set B_factor  0.88
168
set F_factor  0.00
169
 
170
# Don't change these unless you know what you are doing
171
set stat_ext    ".stat.rpt"
172
set chk_ext    ".chk.rpt"
173
set gl_ext      ".gl.v"
174
set constr_ext  ".$clock_period.constr"
175
set timing_ext  ".timing.txt"
176
set abc_ext     ".abc"
177
 
178
 
179
# get old sdc, add library specific stuff for abc scripts
180
set sdc_file $::env(yosys_tmp_file_tag).sdc
181
set outfile [open ${sdc_file} w]
182
#puts $outfile $sdc_data
183
puts $outfile "set_driving_cell ${driver}"
184
puts $outfile "set_load ${cload}"
185
close $outfile
186
 
187
 
188
# ABC Scrips
189
set abc_rs_K    "resub,-K,"
190
set abc_rs      "resub"
191
set abc_rsz     "resub,-z"
192
set abc_rw_K    "rewrite,-K,"
193
set abc_rw      "rewrite"
194
set abc_rwz     "rewrite,-z"
195
set abc_rf      "refactor"
196
set abc_rfz     "refactor,-z"
197
set abc_b       "balance"
198
 
199
set abc_resyn2        "${abc_b}; ${abc_rw}; ${abc_rf}; ${abc_b}; ${abc_rw}; ${abc_rwz}; ${abc_b}; ${abc_rfz}; ${abc_rwz}; ${abc_b}"
200
set abc_share         "strash; multi,-m; ${abc_resyn2}"
201
set abc_resyn2a       "${abc_b};${abc_rw};${abc_b};${abc_rw};${abc_rwz};${abc_b};${abc_rwz};${abc_b}"
202
set abc_resyn3        "balance;resub;resub,-K,6;balance;resub,-z;resub,-z,-K,6;balance;resub,-z,-K,5;balance"
203
set abc_resyn2rs      "${abc_b};${abc_rs_K},6;${abc_rw};${abc_rs_K},6,-N,2;${abc_rf};${abc_rs_K},8;${abc_rw};${abc_rs_K},10;${abc_rwz};${abc_rs_K},10,-N,2;${abc_b},${abc_rs_K},12;${abc_rfz};${abc_rs_K},12,-N,2;${abc_rwz};${abc_b}"
204
 
205
set abc_choice        "fraig_store; ${abc_resyn2}; fraig_store; ${abc_resyn2}; fraig_store; fraig_restore"
206
set abc_choice2      "fraig_store; balance; fraig_store; ${abc_resyn2}; fraig_store; ${abc_resyn2}; fraig_store; ${abc_resyn2}; fraig_store; fraig_restore"
207
 
208
set abc_map_old_cnt                     "map,-p,-a,-B,0.2,-A,0.9,-M,0"
209
set abc_map_old_dly         "map,-p,-B,0.2,-A,0.9,-M,0"
210
set abc_retime_area         "retime,-D,{D},-M,5"
211
set abc_retime_dly          "retime,-D,{D},-M,6"
212
set abc_map_new_area        "amap,-m,-Q,0.1,-F,20,-A,20,-C,5000"
213
 
214
set abc_area_recovery_1       "${abc_choice}; map;"
215
set abc_area_recovery_2       "${abc_choice2}; map;"
216
 
217
set map_old_cnt                     "map,-p,-a,-B,0.2,-A,0.9,-M,0"
218
set map_old_dly                     "map,-p,-B,0.2,-A,0.9,-M,0"
219
set abc_retime_area     "retime,-D,{D},-M,5"
220
set abc_retime_dly      "retime,-D,{D},-M,6"
221
set abc_map_new_area    "amap,-m,-Q,0.1,-F,20,-A,20,-C,5000"
222
 
223
if {$buffering==1} {
224
        set abc_fine_tune               "buffer,-N,${max_FO},-S,${max_Tran};upsize,{D};dnsize,{D}"
225
} elseif {$sizing} {
226
        set abc_fine_tune       "upsize,{D};dnsize,{D}"
227
} else {
228
        set abc_fine_tune       ""
229
}
230
 
231
 
232
set delay_scripts [list \
233
        "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly}; scleanup;${abc_map_old_dly};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
234
        \
235
        "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly}; scleanup;${abc_choice2};${abc_map_old_dly};${abc_area_recovery_2}; retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
236
        \
237
        "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly}; scleanup;${abc_choice};${abc_map_old_dly};${abc_area_recovery_1}; retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
238
        \
239
        "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};${abc_choice2};${abc_map_old_dly};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
240
        ]
241
 
242
set area_scripts [list \
243
        "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
244
        \
245
        "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};${abc_choice2};${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
246
        \
247
        "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_choice2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};${abc_choice2};${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
248
        ]
249
 
250
set all_scripts [list {*}$delay_scripts {*}$area_scripts]
251
 
252
set strategy_parts [split $::env(SYNTH_STRATEGY)]
253
 
254
proc synth_strategy_format_err { } {
255
        upvar area_scripts area_scripts
256
        upvar delay_scripts delay_scripts
257
        log -stderr "\[ERROR] Misformatted SYNTH_STRATEGY (\"$::env(SYNTH_STRATEGY)\")."
258
        log -stderr "\[ERROR] Correct format is \"DELAY|AREA 0-[expr [llength $delay_scripts]-1]|0-[expr [llength $area_scripts]-1]\"."
259
        exit 1
260
}
261
 
262
if { [llength $strategy_parts] != 2 } {
263
        synth_strategy_format_err
264
}
265
 
266
set strategy_type [lindex $strategy_parts 0]
267
set strategy_type_idx [lindex $strategy_parts 1]
268
 
269
if { $strategy_type != "AREA" && $strategy_type != "DELAY" } {
270
        log -stderr "\[ERROR] AREA|DELAY tokens not found. ($strategy_type)"
271
        synth_strategy_format_err
272
}
273
 
274
if { $strategy_type == "DELAY" && $strategy_type_idx >= [llength $delay_scripts] } {
275
        log -stderr "\[ERROR] strategy index ($strategy_type_idx) is too high."
276
        synth_strategy_format_err
277
}
278
 
279
if { $strategy_type == "AREA" && $strategy_type_idx >= [llength $area_scripts] } {
280
        log -stderr "\[ERROR] strategy index ($strategy_type_idx) is too high."
281
        synth_strategy_format_err
282
}
283
 
284
if { $strategy_type == "DELAY" } {
285
        set strategy $strategy_type_idx
286
} else {
287
        set strategy [expr {[llength $delay_scripts]+$strategy_type_idx}]
288
}
289
 
290
 
291
for { set i 0 } { $i < [llength $::env(VERILOG_FILES)] } { incr i } {
292
        read_verilog -sv {*}$vIdirsArgs [lindex $::env(VERILOG_FILES) $i]
293
}
294
 
295
if { [info exists ::env(VERILOG_FILES_BLACKBOX)] } {
296
        foreach verilog_file $::env(VERILOG_FILES_BLACKBOX) {
297
                read_verilog -sv {*}$vIdirsArgs -lib $verilog_file
298
        }
299
}
300
select -module $vtop
301
show -format dot -prefix $::env(TMP_DIR)/synthesis/hierarchy
302
select -clear
303
 
304
hierarchy -check -top $vtop
305
 
306
# Infer tri-state buffers.
307
set tbuf_map false
308
if { [info exists ::env(TRISTATE_BUFFER_MAP)] } {
309
        if { [file exists $::env(TRISTATE_BUFFER_MAP)] } {
310
                set tbuf_map true
311
                tribuf
312
        } else {
313
          log "WARNING: TRISTATE_BUFFER_MAP is defined but could not be found: $::env(TRISTATE_BUFFER_MAP)"
314
        }
315
}
316
 
317
if { $::env(SYNTH_NO_FLAT) } {
318
        synth -top $vtop
319
} else {
320
        synth -top $vtop -flatten
321
}
322
 
323
share -aggressive
324
opt
325
opt_clean -purge
326
 
327
tee -o "$::env(yosys_report_file_tag)_pre.stat" stat
328
 
329
# Map tri-state buffers.
330
if { $tbuf_map } {
331
        log {mapping tbuf}
332
        techmap -map $::env(TRISTATE_BUFFER_MAP)
333
        simplemap
334
}
335
 
336
# handle technology mapping of 4-MUX, and tell Yosys to infer 4-muxes
337
if { [info exists ::env(SYNTH_MUX4_MAP)] && [file exists $::env(SYNTH_MUX4_MAP)] } {
338
  muxcover -mux4
339
  techmap -map $::env(SYNTH_MUX4_MAP)
340
  simplemap
341
}
342
 
343
# handle technology mapping of 2-MUX
344
if { [info exists ::env(SYNTH_MUX_MAP)] && [file exists $::env(SYNTH_MUX_MAP)] } {
345
  techmap -map $::env(SYNTH_MUX_MAP)
346
  simplemap
347
}
348
 
349
# handle technology mapping of latches
350
if { [info exists ::env(SYNTH_LATCH_MAP)] && [file exists $::env(SYNTH_LATCH_MAP)] } {
351
        techmap -map $::env(SYNTH_LATCH_MAP)
352
        simplemap
353
}
354
 
355
dfflibmap -liberty $sclib
356
tee -o "$::env(yosys_report_file_tag)_dff.stat" stat
357
 
358
if { [info exists ::env(SYNTH_EXPLORE)] && $::env(SYNTH_EXPLORE) } {
359
        design -save myDesign
360
 
361
        for { set index 0 }  { $index < [llength $all_scripts] }  { incr index } {
362
                log "\[INFO\]: ABC: WireLoad : S_$index"
363
                design -load myDesign
364
 
365
                abc -D $clock_period \
366
                        -constr "$sdc_file" \
367
                        -liberty $sclib  \
368
                        -script [lindex $all_scripts $index]
369
 
370
                setundef -zero
371
 
372
                hilomap -hicell {*}$::env(SYNTH_TIEHI_PORT) -locell {*}$::env(SYNTH_TIELO_PORT)
373
 
374
                # get rid of the assignments that make verilog2def fail
375
                splitnets
376
                opt_clean -purge
377
                insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)
378
 
379
                tee -o "$::env(yosys_report_file_tag)_$index$chk_ext" check
380
                write_verilog -noattr -noexpr -nohex -nodec -defparam "$::env(yosys_result_file_tag)_$index.v"
381
                design -reset
382
        }
383
} else {
384
 
385
        log "\[INFO\]: ABC: WireLoad : S_$strategy"
386
 
387
        abc -D $clock_period \
388
                -constr "$sdc_file" \
389
                -liberty $sclib  \
390
                -script [lindex $all_scripts $strategy] \
391
                -showtmp;
392
 
393
        setundef -zero
394
 
395
        hilomap -hicell {*}$::env(SYNTH_TIEHI_PORT) -locell {*}$::env(SYNTH_TIELO_PORT)
396
 
397
        # get rid of the assignments that make verilog2def fail
398
        splitnets
399
        opt_clean -purge
400
        insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)
401
 
402
        tee -o "$::env(yosys_report_file_tag)_$strategy$chk_ext" check
403
        write_verilog -noattr -noexpr -nohex -nodec -defparam "$::env(SAVE_NETLIST)"
404
}
405
 
406
if { $::env(SYNTH_NO_FLAT) } {
407
        design -reset
408
        file copy -force $::env(SAVE_NETLIST) $::env(yosys_tmp_file_tag)_unflat.v
409
        read_verilog -sv $::env(SAVE_NETLIST)
410
        synth -top $vtop -flatten
411
        splitnets
412
        opt_clean -purge
413
        insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)
414
        write_verilog -noattr -noexpr -nohex -nodec -defparam "$::env(SAVE_NETLIST)"
415
        tee -o "$::env(yosys_report_file_tag)_$strategy$chk_ext" check
416
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.