[#73220] remove saif trace example

This commit is contained in:
Mateusz Gancarz 2025-02-27 13:51:10 +01:00
parent 6ebc4fae7f
commit d54ebaa14b
11 changed files with 0 additions and 2267 deletions

View File

@ -1,100 +0,0 @@
This example workflow was tested on Debian 12.
## Introduction
To demonstrate the workflow of creating a SAIF file from the simulation trace and a power consumption report generation, we have prepared a simple example located in the `Verilator` project directory under the `examples/saif_example` path.
## Prerequisites
This example assumes that cloned repositories are located in the `~/dev` directory. You will need to clone and build these projects:
- `Verilator` from `https://github.com/antmicro/verilator` on branch `saif`. You can build it with running these commands in the project directory
```
autoconf
./configure --prefix $(pwd)
make -j $(nproc)
```
and then add the binary directory `~/dev/verilator/bin/` to the `PATH` environmental variable.
- `OpenSTA` from `https://github.com/The-OpenROAD-Project/OpenSTA`. For building instructions, you can refer to the project `README` file. Keep in mind to add the directory where the `sta` binary is located to the `PATH` environmental variable.
- `OpenROAD-flow-scripts` with `Yosys` from `https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts`. To build `Yosys` in `OpenROAD-flow-scripts`, you will need to clone it's submodule with
`git submodule update --init --recursive tools/yosys`
then go to the `tools/yosys` directory and run
`make -j $(nproc) PREFIX=~/dev/OpenROAD-flow-scripts/tools/install/yosys install`
## Workflow
### Generating SAIF file from trace
From the `examples/saif_example` directory in the `verilator` project, run verilation and compile model to executable with SAIF trace flag enabled `--trace-saif`:
`verilator --cc --exe --build --trace-saif -j -Wno-latch gcd.v saif_trace.cpp`
Then run simulation with the generated binary
`./obj_dir/Vgcd`
This will generate the `simx.saif` file in the current directory with the trace output.
### Generating power consumption report
For power consumption report generation you will need to prepare simulated model sources for `Yosys` synthesis in the `OpenROAD` project directory. This example workflow uses the `asap7` platform. From the `examples/saif_example` directory in the `verilator` project, copy `saif_trace_example` contents to `OpenROAD-flow-scripts/flow/designs/asap7/` and `src/saif_trace_example` to `OpenROAD-flow-scripts/flow/designs/src/`
```
cp -r saif_trace_example ~/dev/OpenROAD-flow-scripts/flow/designs/asap7/
cp -r src/saif_trace_example ~/dev/OpenROAD-flow-scripts/flow/designs/src/
```
Then go to the `OpenROAD-flow-scripts` project top directory and run the `Yosys` synthesis with
`make -C flow DESIGN_CONFIG=designs/asap7/saif_trace_example/config.mk synth`
Result of the synthesis will be located in the `~/dev/OpenROAD-flow-scripts/flow/results/asap7/saif_trace_example/base/` directory.
Copy previously generated SAIF file from trace to the synthesis result directory with
`cp ~/dev/verilator/examples/saif_example/simx.saif ~/dev/OpenROAD-flow-scripts/flow/results/asap7/saif_trace_example/base/`
For liberty files paths simplicity, you can export the path to their directory as the `LIB_DIR` environmental variable. In this example it will be
```
export LIB_DIR=~/dev/OpenROAD-flow-scripts/flow/platforms/asap7/lib/NLDM/
```
Go to the synthesis results directory, run `sta` and then execute commands below
```
read_liberty $::env(LIB_DIR)/asap7sc7p5t_AO_RVT_FF_nldm_211120.lib.gz
read_liberty $::env(LIB_DIR)/asap7sc7p5t_INVBUF_RVT_FF_nldm_220122.lib.gz
read_liberty $::env(LIB_DIR)/asap7sc7p5t_OA_RVT_FF_nldm_211120.lib.gz
read_liberty $::env(LIB_DIR)/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz
read_liberty $::env(LIB_DIR)/asap7sc7p5t_SEQ_RVT_FF_nldm_220123.lib
read_verilog 1_synth.v
link_design gcd
read_sdc 1_synth.sdc
read_saif -scope gcd simx.saif
report_power
```
This will generate power consumption report that should look like this
```
Group Internal Switching Leakage Total
Power Power Power Power (Watts)
----------------------------------------------------------------
Sequential 5.19e-05 5.18e-06 5.34e-09 5.71e-05 43.5%
Combinational 4.15e-05 3.26e-05 2.17e-08 7.42e-05 56.5%
Clock 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.0%
Macro 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.0%
Pad 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.0%
----------------------------------------------------------------
Total 9.35e-05 3.78e-05 2.70e-08 1.31e-04 100.0%
71.2% 28.8% 0.0%
```

View File

@ -1,755 +0,0 @@
//-----------------------------------------------------------------------------
// GcdUnit
//-----------------------------------------------------------------------------
//
// Originally Generated from PyMTL with a few modifications to make it more
// friendly to OpenROAD tools
//module GcdUnit
module gcd
(
input wire clk,
input wire [ 31:0] req_msg,
output wire req_rdy,
input wire req_val,
input wire reset,
output wire [ 15:0] resp_msg,
input wire resp_rdy,
output wire resp_val
);
// ctrl temporaries
wire [ 0:0] ctrl$is_b_zero;
wire [ 0:0] ctrl$resp_rdy;
wire [ 0:0] ctrl$clk;
wire [ 0:0] ctrl$is_a_lt_b;
wire [ 0:0] ctrl$req_val;
wire [ 0:0] ctrl$reset;
wire [ 1:0] ctrl$a_mux_sel;
wire [ 0:0] ctrl$resp_val;
wire [ 0:0] ctrl$b_mux_sel;
wire [ 0:0] ctrl$b_reg_en;
wire [ 0:0] ctrl$a_reg_en;
wire [ 0:0] ctrl$req_rdy;
GcdUnitCtrlRTL_0x4d0fc71ead8d3d9e ctrl
(
.is_b_zero ( ctrl$is_b_zero ),
.resp_rdy ( ctrl$resp_rdy ),
.clk ( ctrl$clk ),
.is_a_lt_b ( ctrl$is_a_lt_b ),
.req_val ( ctrl$req_val ),
.reset ( ctrl$reset ),
.a_mux_sel ( ctrl$a_mux_sel ),
.resp_val ( ctrl$resp_val ),
.b_mux_sel ( ctrl$b_mux_sel ),
.b_reg_en ( ctrl$b_reg_en ),
.a_reg_en ( ctrl$a_reg_en ),
.req_rdy ( ctrl$req_rdy )
);
// dpath temporaries
wire [ 1:0] dpath$a_mux_sel;
wire [ 0:0] dpath$clk;
wire [ 15:0] dpath$req_msg_b;
wire [ 15:0] dpath$req_msg_a;
wire [ 0:0] dpath$b_mux_sel;
wire [ 0:0] dpath$reset;
wire [ 0:0] dpath$b_reg_en;
wire [ 0:0] dpath$a_reg_en;
wire [ 0:0] dpath$is_b_zero;
wire [ 15:0] dpath$resp_msg;
wire [ 0:0] dpath$is_a_lt_b;
GcdUnitDpathRTL_0x4d0fc71ead8d3d9e dpath
(
.a_mux_sel ( dpath$a_mux_sel ),
.clk ( dpath$clk ),
.req_msg_b ( dpath$req_msg_b ),
.req_msg_a ( dpath$req_msg_a ),
.b_mux_sel ( dpath$b_mux_sel ),
.reset ( dpath$reset ),
.b_reg_en ( dpath$b_reg_en ),
.a_reg_en ( dpath$a_reg_en ),
.is_b_zero ( dpath$is_b_zero ),
.resp_msg ( dpath$resp_msg ),
.is_a_lt_b ( dpath$is_a_lt_b )
);
// signal connections
assign ctrl$clk = clk;
assign ctrl$is_a_lt_b = dpath$is_a_lt_b;
assign ctrl$is_b_zero = dpath$is_b_zero;
assign ctrl$req_val = req_val;
assign ctrl$reset = reset;
assign ctrl$resp_rdy = resp_rdy;
assign dpath$a_mux_sel = ctrl$a_mux_sel;
assign dpath$a_reg_en = ctrl$a_reg_en;
assign dpath$b_mux_sel = ctrl$b_mux_sel;
assign dpath$b_reg_en = ctrl$b_reg_en;
assign dpath$clk = clk;
assign dpath$req_msg_a = req_msg[31:16];
assign dpath$req_msg_b = req_msg[15:0];
assign dpath$reset = reset;
assign req_rdy = ctrl$req_rdy;
assign resp_msg = dpath$resp_msg;
assign resp_val = ctrl$resp_val;
endmodule // GcdUnit
//-----------------------------------------------------------------------------
// GcdUnitCtrlRTL_0x4d0fc71ead8d3d9e
//-----------------------------------------------------------------------------
module GcdUnitCtrlRTL_0x4d0fc71ead8d3d9e
(
output reg [ 1:0] a_mux_sel,
output reg [ 0:0] a_reg_en,
output reg [ 0:0] b_mux_sel,
output reg [ 0:0] b_reg_en,
input wire [ 0:0] clk,
input wire [ 0:0] is_a_lt_b,
input wire [ 0:0] is_b_zero,
output reg [ 0:0] req_rdy,
input wire [ 0:0] req_val,
input wire [ 0:0] reset,
input wire [ 0:0] resp_rdy,
output reg [ 0:0] resp_val
);
// register declarations
reg [ 1:0] curr_state__0;
reg [ 1:0] current_state__1;
reg [ 0:0] do_sub;
reg [ 0:0] do_swap;
reg [ 1:0] next_state__0;
reg [ 1:0] state$in_;
// localparam declarations
localparam A_MUX_SEL_B = 2;
localparam A_MUX_SEL_IN = 0;
localparam A_MUX_SEL_SUB = 1;
localparam A_MUX_SEL_X = 0;
localparam B_MUX_SEL_A = 0;
localparam B_MUX_SEL_IN = 1;
localparam B_MUX_SEL_X = 0;
localparam STATE_CALC = 1;
localparam STATE_DONE = 2;
localparam STATE_IDLE = 0;
// state temporaries
wire [ 0:0] state$reset;
wire [ 0:0] state$clk;
wire [ 1:0] state$out;
RegRst_0x9f365fdf6c8998a state
(
.reset ( state$reset ),
.in_ ( state$in_ ),
.clk ( state$clk ),
.out ( state$out )
);
// signal connections
assign state$clk = clk;
assign state$reset = reset;
// PYMTL SOURCE:
//
// @s.combinational
// def state_transitions():
//
// curr_state = s.state.out
// next_state = s.state.out
//
// # Transistions out of IDLE state
//
// if ( curr_state == s.STATE_IDLE ):
// if ( s.req_val and s.req_rdy ):
// next_state = s.STATE_CALC
//
// # Transistions out of CALC state
//
// if ( curr_state == s.STATE_CALC ):
// if ( not s.is_a_lt_b and s.is_b_zero ):
// next_state = s.STATE_DONE
//
// # Transistions out of DONE state
//
// if ( curr_state == s.STATE_DONE ):
// if ( s.resp_val and s.resp_rdy ):
// next_state = s.STATE_IDLE
//
// s.state.in_.value = next_state
// logic for state_transitions()
always @ (*) begin
curr_state__0 = state$out;
next_state__0 = state$out;
if ((curr_state__0 == STATE_IDLE)) begin
if ((req_val&&req_rdy)) begin
next_state__0 = STATE_CALC;
end
else begin
end
end
else begin
end
if ((curr_state__0 == STATE_CALC)) begin
if ((!is_a_lt_b&&is_b_zero)) begin
next_state__0 = STATE_DONE;
end
else begin
end
end
else begin
end
if ((curr_state__0 == STATE_DONE)) begin
if ((resp_val&&resp_rdy)) begin
next_state__0 = STATE_IDLE;
end
else begin
end
end
else begin
end
state$in_ = next_state__0;
end
// PYMTL SOURCE:
//
// @s.combinational
// def state_outputs():
//
// current_state = s.state.out
//
// # In IDLE state we simply wait for inputs to arrive and latch them
//
// if current_state == s.STATE_IDLE:
// s.req_rdy.value = 1
// s.resp_val.value = 0
// s.a_mux_sel.value = A_MUX_SEL_IN
// s.a_reg_en.value = 1
// s.b_mux_sel.value = B_MUX_SEL_IN
// s.b_reg_en.value = 1
//
// # In CALC state we iteratively swap/sub to calculate GCD
//
// elif current_state == s.STATE_CALC:
//
// s.do_swap.value = s.is_a_lt_b
// s.do_sub.value = ~s.is_b_zero
//
// s.req_rdy.value = 0
// s.resp_val.value = 0
// s.a_mux_sel.value = A_MUX_SEL_B if s.do_swap else A_MUX_SEL_SUB
// s.a_reg_en.value = 1
// s.b_mux_sel.value = B_MUX_SEL_A
// s.b_reg_en.value = s.do_swap
//
// # In DONE state we simply wait for output transaction to occur
//
// elif current_state == s.STATE_DONE:
// s.req_rdy.value = 0
// s.resp_val.value = 1
// s.a_mux_sel.value = A_MUX_SEL_X
// s.a_reg_en.value = 0
// s.b_mux_sel.value = B_MUX_SEL_X
// s.b_reg_en.value = 0
//
// # Default case that we should not hit
//
// else:
// s.req_rdy.value = 0
// s.resp_val.value = 0
// s.a_mux_sel.value = A_MUX_SEL_X
// s.a_reg_en.value = 0
// s.b_mux_sel.value = B_MUX_SEL_X
// s.b_reg_en.value = 0
// logic for state_outputs()
always @ (*) begin
current_state__1 = state$out;
if ((current_state__1 == STATE_IDLE)) begin
req_rdy = 1;
resp_val = 0;
a_mux_sel = A_MUX_SEL_IN;
a_reg_en = 1;
b_mux_sel = B_MUX_SEL_IN;
b_reg_en = 1;
end
else begin
if ((current_state__1 == STATE_CALC)) begin
do_swap = is_a_lt_b;
do_sub = ~is_b_zero;
req_rdy = 0;
resp_val = 0;
a_mux_sel = do_swap ? A_MUX_SEL_B : A_MUX_SEL_SUB;
a_reg_en = 1;
b_mux_sel = B_MUX_SEL_A;
b_reg_en = do_swap;
end
else begin
if ((current_state__1 == STATE_DONE)) begin
req_rdy = 0;
resp_val = 1;
a_mux_sel = A_MUX_SEL_X;
a_reg_en = 0;
b_mux_sel = B_MUX_SEL_X;
b_reg_en = 0;
end
else begin
req_rdy = 0;
resp_val = 0;
a_mux_sel = A_MUX_SEL_X;
a_reg_en = 0;
b_mux_sel = B_MUX_SEL_X;
b_reg_en = 0;
end
end
end
end
endmodule // GcdUnitCtrlRTL_0x4d0fc71ead8d3d9e
//-----------------------------------------------------------------------------
// RegRst_0x9f365fdf6c8998a
//-----------------------------------------------------------------------------
// dtype: 2
// reset_value: 0
module RegRst_0x9f365fdf6c8998a
(
input wire [ 0:0] clk,
input wire [ 1:0] in_,
output reg [ 1:0] out,
input wire [ 0:0] reset
);
// localparam declarations
localparam reset_value = 0;
// PYMTL SOURCE:
//
// @s.posedge_clk
// def seq_logic():
// if s.reset:
// s.out.next = reset_value
// else:
// s.out.next = s.in_
// logic for seq_logic()
always @ (posedge clk) begin
if (reset) begin
out <= reset_value;
end
else begin
out <= in_;
end
end
endmodule // RegRst_0x9f365fdf6c8998a
//-----------------------------------------------------------------------------
// GcdUnitDpathRTL_0x4d0fc71ead8d3d9e
//-----------------------------------------------------------------------------
module GcdUnitDpathRTL_0x4d0fc71ead8d3d9e
(
input wire [ 1:0] a_mux_sel,
input wire [ 0:0] a_reg_en,
input wire [ 0:0] b_mux_sel,
input wire [ 0:0] b_reg_en,
input wire [ 0:0] clk,
output wire [ 0:0] is_a_lt_b,
output wire [ 0:0] is_b_zero,
input wire [ 15:0] req_msg_a,
input wire [ 15:0] req_msg_b,
input wire [ 0:0] reset,
output wire [ 15:0] resp_msg
);
// wire declarations
wire [ 15:0] sub_out;
wire [ 15:0] b_reg_out;
// a_reg temporaries
wire [ 0:0] a_reg$reset;
wire [ 15:0] a_reg$in_;
wire [ 0:0] a_reg$clk;
wire [ 0:0] a_reg$en;
wire [ 15:0] a_reg$out;
RegEn_0x68db79c4ec1d6e5b a_reg
(
.reset ( a_reg$reset ),
.in_ ( a_reg$in_ ),
.clk ( a_reg$clk ),
.en ( a_reg$en ),
.out ( a_reg$out )
);
// a_lt_b temporaries
wire [ 0:0] a_lt_b$reset;
wire [ 0:0] a_lt_b$clk;
wire [ 15:0] a_lt_b$in0;
wire [ 15:0] a_lt_b$in1;
wire [ 0:0] a_lt_b$out;
LtComparator_0x422b1f52edd46a85 a_lt_b
(
.reset ( a_lt_b$reset ),
.clk ( a_lt_b$clk ),
.in0 ( a_lt_b$in0 ),
.in1 ( a_lt_b$in1 ),
.out ( a_lt_b$out )
);
// b_zero temporaries
wire [ 0:0] b_zero$reset;
wire [ 15:0] b_zero$in_;
wire [ 0:0] b_zero$clk;
wire [ 0:0] b_zero$out;
ZeroComparator_0x422b1f52edd46a85 b_zero
(
.reset ( b_zero$reset ),
.in_ ( b_zero$in_ ),
.clk ( b_zero$clk ),
.out ( b_zero$out )
);
// a_mux temporaries
wire [ 0:0] a_mux$reset;
wire [ 15:0] a_mux$in_$000;
wire [ 15:0] a_mux$in_$001;
wire [ 15:0] a_mux$in_$002;
wire [ 0:0] a_mux$clk;
wire [ 1:0] a_mux$sel;
wire [ 15:0] a_mux$out;
Mux_0x683fa1a418b072c9 a_mux
(
.reset ( a_mux$reset ),
.in_$000 ( a_mux$in_$000 ),
.in_$001 ( a_mux$in_$001 ),
.in_$002 ( a_mux$in_$002 ),
.clk ( a_mux$clk ),
.sel ( a_mux$sel ),
.out ( a_mux$out )
);
// b_mux temporaries
wire [ 0:0] b_mux$reset;
wire [ 15:0] b_mux$in_$000;
wire [ 15:0] b_mux$in_$001;
wire [ 0:0] b_mux$clk;
wire [ 0:0] b_mux$sel;
wire [ 15:0] b_mux$out;
Mux_0xdd6473406d1a99a b_mux
(
.reset ( b_mux$reset ),
.in_$000 ( b_mux$in_$000 ),
.in_$001 ( b_mux$in_$001 ),
.clk ( b_mux$clk ),
.sel ( b_mux$sel ),
.out ( b_mux$out )
);
// sub temporaries
wire [ 0:0] sub$reset;
wire [ 0:0] sub$clk;
wire [ 15:0] sub$in0;
wire [ 15:0] sub$in1;
wire [ 15:0] sub$out;
Subtractor_0x422b1f52edd46a85 sub
(
.reset ( sub$reset ),
.clk ( sub$clk ),
.in0 ( sub$in0 ),
.in1 ( sub$in1 ),
.out ( sub$out )
);
// b_reg temporaries
wire [ 0:0] b_reg$reset;
wire [ 15:0] b_reg$in_;
wire [ 0:0] b_reg$clk;
wire [ 0:0] b_reg$en;
wire [ 15:0] b_reg$out;
RegEn_0x68db79c4ec1d6e5b b_reg
(
.reset ( b_reg$reset ),
.in_ ( b_reg$in_ ),
.clk ( b_reg$clk ),
.en ( b_reg$en ),
.out ( b_reg$out )
);
// signal connections
assign a_lt_b$clk = clk;
assign a_lt_b$in0 = a_reg$out;
assign a_lt_b$in1 = b_reg$out;
assign a_lt_b$reset = reset;
assign a_mux$clk = clk;
assign a_mux$in_$000 = req_msg_a;
assign a_mux$in_$001 = sub_out;
assign a_mux$in_$002 = b_reg_out;
assign a_mux$reset = reset;
assign a_mux$sel = a_mux_sel;
assign a_reg$clk = clk;
assign a_reg$en = a_reg_en;
assign a_reg$in_ = a_mux$out;
assign a_reg$reset = reset;
assign b_mux$clk = clk;
assign b_mux$in_$000 = a_reg$out;
assign b_mux$in_$001 = req_msg_b;
assign b_mux$reset = reset;
assign b_mux$sel = b_mux_sel;
assign b_reg$clk = clk;
assign b_reg$en = b_reg_en;
assign b_reg$in_ = b_mux$out;
assign b_reg$reset = reset;
assign b_reg_out = b_reg$out;
assign b_zero$clk = clk;
assign b_zero$in_ = b_reg$out;
assign b_zero$reset = reset;
assign is_a_lt_b = a_lt_b$out;
assign is_b_zero = b_zero$out;
assign resp_msg = sub$out;
assign sub$clk = clk;
assign sub$in0 = a_reg$out;
assign sub$in1 = b_reg$out;
assign sub$reset = reset;
assign sub_out = sub$out;
endmodule // GcdUnitDpathRTL_0x4d0fc71ead8d3d9e
//-----------------------------------------------------------------------------
// RegEn_0x68db79c4ec1d6e5b
//-----------------------------------------------------------------------------
// dtype: 16
module RegEn_0x68db79c4ec1d6e5b
(
input wire [ 0:0] clk,
input wire [ 0:0] en,
input wire [ 15:0] in_,
output reg [ 15:0] out,
input wire [ 0:0] reset
);
// PYMTL SOURCE:
//
// @s.posedge_clk
// def seq_logic():
// if s.en:
// s.out.next = s.in_
// logic for seq_logic()
always @ (posedge clk) begin
if (en) begin
out <= in_;
end
else begin
end
end
endmodule // RegEn_0x68db79c4ec1d6e5b
//-----------------------------------------------------------------------------
// LtComparator_0x422b1f52edd46a85
//-----------------------------------------------------------------------------
// nbits: 16
module LtComparator_0x422b1f52edd46a85
(
input wire [ 0:0] clk,
input wire [ 15:0] in0,
input wire [ 15:0] in1,
output reg [ 0:0] out,
input wire [ 0:0] reset
);
// PYMTL SOURCE:
//
// @s.combinational
// def comb_logic():
// s.out.value = s.in0 < s.in1
// logic for comb_logic()
always @ (*) begin
out = (in0 < in1);
end
endmodule // LtComparator_0x422b1f52edd46a85
//-----------------------------------------------------------------------------
// ZeroComparator_0x422b1f52edd46a85
//-----------------------------------------------------------------------------
// nbits: 16
module ZeroComparator_0x422b1f52edd46a85
(
input wire [ 0:0] clk,
input wire [ 15:0] in_,
output reg [ 0:0] out,
input wire [ 0:0] reset
);
// PYMTL SOURCE:
//
// @s.combinational
// def comb_logic():
// s.out.value = s.in_ == 0
// logic for comb_logic()
always @ (*) begin
out = (in_ == 0);
end
endmodule // ZeroComparator_0x422b1f52edd46a85
//-----------------------------------------------------------------------------
// Mux_0x683fa1a418b072c9
//-----------------------------------------------------------------------------
// dtype: 16
// nports: 3
module Mux_0x683fa1a418b072c9
(
input wire [ 0:0] clk,
input wire [ 15:0] in_$000,
input wire [ 15:0] in_$001,
input wire [ 15:0] in_$002,
output reg [ 15:0] out,
input wire [ 0:0] reset,
input wire [ 1:0] sel
);
// localparam declarations
localparam nports = 3;
// array declarations
wire [ 15:0] in_[0:2];
assign in_[ 0] = in_$000;
assign in_[ 1] = in_$001;
assign in_[ 2] = in_$002;
// PYMTL SOURCE:
//
// @s.combinational
// def comb_logic():
// assert s.sel < nports
// s.out.v = s.in_[ s.sel ]
// logic for comb_logic()
always @ (*) begin
out = in_[sel];
end
endmodule // Mux_0x683fa1a418b072c9
//-----------------------------------------------------------------------------
// Mux_0xdd6473406d1a99a
//-----------------------------------------------------------------------------
// dtype: 16
// nports: 2
module Mux_0xdd6473406d1a99a
(
input wire [ 0:0] clk,
input wire [ 15:0] in_$000,
input wire [ 15:0] in_$001,
output reg [ 15:0] out,
input wire [ 0:0] reset,
input wire [ 0:0] sel
);
// localparam declarations
localparam nports = 2;
// array declarations
wire [ 15:0] in_[0:1];
assign in_[ 0] = in_$000;
assign in_[ 1] = in_$001;
// PYMTL SOURCE:
//
// @s.combinational
// def comb_logic():
// assert s.sel < nports
// s.out.v = s.in_[ s.sel ]
// logic for comb_logic()
always @ (*) begin
out = in_[sel];
end
endmodule // Mux_0xdd6473406d1a99a
//-----------------------------------------------------------------------------
// Subtractor_0x422b1f52edd46a85
//-----------------------------------------------------------------------------
// nbits: 16
module Subtractor_0x422b1f52edd46a85
(
input wire [ 0:0] clk,
input wire [ 15:0] in0,
input wire [ 15:0] in1,
output reg [ 15:0] out,
input wire [ 0:0] reset
);
// PYMTL SOURCE:
//
// @s.combinational
// def comb_logic():
// s.out.value = s.in0 - s.in1
// logic for comb_logic()
always @ (*) begin
out = (in0-in1);
end
endmodule // Subtractor_0x422b1f52edd46a85

View File

@ -1,62 +0,0 @@
// -*- mode: C++; c-file-style: "cc-mode" -*-
//
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2025 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
#include <verilated.h>
#include <verilated_saif_c.h>
#include <memory>
#include "Vgcd.h"
int errors = 0;
unsigned long long main_time = 0;
double sc_time_stamp() { return static_cast<double>(main_time); }
const char* trace_name() {
static char name[1000];
VL_SNPRINTF(name, 1000, "simx.saif");
return name;
}
int main(int argc, char** argv) {
Verilated::debug(0);
Verilated::traceEverOn(true);
Verilated::commandArgs(argc, argv);
std::unique_ptr<Vgcd> top{new Vgcd};
std::unique_ptr<VerilatedSaifC> tfp{new VerilatedSaifC};
static constexpr int SIMULATION_DURATION{10000};
top->trace(tfp.get(), SIMULATION_DURATION);
tfp->open(trace_name());
top->clk = 0;
while (main_time < SIMULATION_DURATION) {
top->clk = !top->clk;
top->req_msg = rand() & 0xffffffff;
top->req_val = rand() & 0x1;
top->reset = rand() & 0x1;
top->resp_rdy = rand() & 0x1;
top->eval();
tfp->dump(static_cast<unsigned int>(main_time));
++main_time;
}
tfp->close();
top->final();
tfp.reset();
top.reset();
printf("*-* All Finished *-*\n");
return errors;
}

View File

@ -1,92 +0,0 @@
{
"_SDC_FILE_PATH": "constraint.sdc",
"_SDC_CLK_PERIOD": {
"type": "float",
"minmax": [
1200,
2000
],
"step": 0
},
"CORE_UTILIZATION": {
"type": "int",
"minmax": [
5,
10
],
"step": 1
},
"CORE_ASPECT_RATIO": {
"type": "float",
"minmax": [
0.9,
1.1
],
"step": 0
},
"CORE_MARGIN": {
"type": "int",
"minmax": [
2,
2
],
"step": 0
},
"CELL_PAD_IN_SITES_GLOBAL_PLACEMENT": {
"type": "int",
"minmax": [
0,
3
],
"step": 1
},
"CELL_PAD_IN_SITES_DETAIL_PLACEMENT": {
"type": "int",
"minmax": [
0,
3
],
"step": 1
},
"_FR_LAYER_ADJUST": {
"type": "float",
"minmax": [
0.0,
0.1
],
"step": 0
},
"PLACE_DENSITY_LB_ADDON": {
"type": "float",
"minmax": [
0.0,
0.2
],
"step": 0
},
"_PINS_DISTANCE": {
"type": "int",
"minmax": [
1,
1
],
"step": 1
},
"CTS_CLUSTER_SIZE": {
"type": "int",
"minmax": [
10,
200
],
"step": 1
},
"CTS_CLUSTER_DIAMETER": {
"type": "int",
"minmax": [
20,
400
],
"step": 1
},
"_FR_FILE_PATH": ""
}

View File

@ -1,17 +0,0 @@
export PLATFORM = asap7
export DESIGN_NICKNAME = saif_trace_example
export DESIGN_NAME = gcd
export VERILOG_FILES = $(sort $(wildcard $(DESIGN_HOME)/src/$(DESIGN_NICKNAME)/*.v))
export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc
export CORE_UTILIZATION = 40
export CORE_ASPECT_RATIO = 1
export CORE_MARGIN = 2
export PLACE_DENSITY_LB_ADDON = 0.20
export ENABLE_DPO = 0
export TNS_END_PERCENT = 100

View File

@ -1,13 +0,0 @@
set clk_name core_clock
set clk_port_name clk
set clk_period 1260
set clk_io_pct 0.2
set clk_port [get_ports $clk_port_name]
create_clock -name $clk_name -period $clk_period $clk_port
set non_clock_inputs [lsearch -inline -all -not -exact [all_inputs] $clk_port]
set_input_delay [expr $clk_period * $clk_io_pct] -clock $clk_name $non_clock_inputs
set_output_delay [expr $clk_period * $clk_io_pct] -clock $clk_name [all_outputs]

View File

@ -1,384 +0,0 @@
{
"constraints__clocks__count": 1,
"constraints__clocks__details": [
"core_clock: 1260.0000"
],
"cts__clock__skew__hold": 128.848,
"cts__clock__skew__setup": 154.028,
"cts__cpu__total": 90.71,
"cts__design__core__area": 5654.27,
"cts__design__die__area": 6307.06,
"cts__design__instance__area": 2632.36,
"cts__design__instance__area__cover": 0,
"cts__design__instance__area__macros": 0,
"cts__design__instance__area__padcells": 0,
"cts__design__instance__area__stdcell": 2632.36,
"cts__design__instance__count": 21501,
"cts__design__instance__count__cover": 0,
"cts__design__instance__count__hold_buffer": 0,
"cts__design__instance__count__macros": 0,
"cts__design__instance__count__padcells": 0,
"cts__design__instance__count__setup_buffer": 62,
"cts__design__instance__count__stdcell": 21501,
"cts__design__instance__displacement__max": 1.116,
"cts__design__instance__displacement__mean": 0.001,
"cts__design__instance__displacement__total": 39.259,
"cts__design__instance__utilization": 0.465553,
"cts__design__instance__utilization__stdcell": 0.465553,
"cts__design__io": 264,
"cts__design__rows": 278,
"cts__design__rows:asap7sc7p5t": 278,
"cts__design__sites": 387810,
"cts__design__sites:asap7sc7p5t": 387810,
"cts__design__violations": 0,
"cts__flow__errors__count": 0,
"cts__flow__warnings__count": 11,
"cts__mem__peak": 723160.0,
"cts__power__internal__total": 0.0206542,
"cts__power__leakage__total": 2.02506e-06,
"cts__power__switching__total": 0.0215231,
"cts__power__total": 0.0421793,
"cts__route__wirelength__estimated": 94069.5,
"cts__runtime__total": "1:31.32",
"cts__timing__drv__hold_violation_count": 0,
"cts__timing__drv__max_cap": 0,
"cts__timing__drv__max_cap_limit": 0.424876,
"cts__timing__drv__max_fanout": 0,
"cts__timing__drv__max_fanout_limit": 0,
"cts__timing__drv__max_slew": 0,
"cts__timing__drv__max_slew_limit": 0.219039,
"cts__timing__drv__setup_violation_count": 3,
"cts__timing__setup__tns": -38.9303,
"cts__timing__setup__ws": -32.5814,
"design__io__hpwl": 5296159,
"design__violations": 0,
"detailedplace__cpu__total": 135.62,
"detailedplace__design__core__area": 5654.27,
"detailedplace__design__die__area": 6307.06,
"detailedplace__design__instance__area": 2564.9,
"detailedplace__design__instance__area__cover": 0,
"detailedplace__design__instance__area__macros": 0,
"detailedplace__design__instance__area__padcells": 0,
"detailedplace__design__instance__area__stdcell": 2564.9,
"detailedplace__design__instance__count": 21241,
"detailedplace__design__instance__count__cover": 0,
"detailedplace__design__instance__count__macros": 0,
"detailedplace__design__instance__count__padcells": 0,
"detailedplace__design__instance__count__stdcell": 21241,
"detailedplace__design__instance__displacement__max": 2.088,
"detailedplace__design__instance__displacement__mean": 0.215,
"detailedplace__design__instance__displacement__total": 4584.86,
"detailedplace__design__instance__utilization": 0.453622,
"detailedplace__design__instance__utilization__stdcell": 0.453622,
"detailedplace__design__io": 264,
"detailedplace__design__rows": 278,
"detailedplace__design__rows:asap7sc7p5t": 278,
"detailedplace__design__sites": 387810,
"detailedplace__design__sites:asap7sc7p5t": 387810,
"detailedplace__design__violations": 0,
"detailedplace__flow__errors__count": 0,
"detailedplace__flow__warnings__count": 10,
"detailedplace__mem__peak": 860888.0,
"detailedplace__power__internal__total": 0.0186292,
"detailedplace__power__leakage__total": 1.96045e-06,
"detailedplace__power__switching__total": 0.0203954,
"detailedplace__power__total": 0.0390265,
"detailedplace__route__wirelength__estimated": 92018.4,
"detailedplace__runtime__total": "2:16.23",
"detailedplace__timing__drv__hold_violation_count": 0,
"detailedplace__timing__drv__max_cap": 0,
"detailedplace__timing__drv__max_cap_limit": 0.42514,
"detailedplace__timing__drv__max_fanout": 0,
"detailedplace__timing__drv__max_fanout_limit": 0,
"detailedplace__timing__drv__max_slew": 0,
"detailedplace__timing__drv__max_slew_limit": 0.0523232,
"detailedplace__timing__drv__setup_violation_count": 255,
"detailedplace__timing__setup__tns": -25892.2,
"detailedplace__timing__setup__ws": -168.407,
"detailedroute__antenna__violating__nets": 0,
"detailedroute__antenna__violating__pins": 0,
"detailedroute__antenna_diodes_count": 0,
"detailedroute__flow__errors__count": 0,
"detailedroute__flow__warnings__count": 11,
"detailedroute__route__drc_errors": 0,
"detailedroute__route__drc_errors__iter:0": 5192,
"detailedroute__route__drc_errors__iter:1": 553,
"detailedroute__route__drc_errors__iter:2": 372,
"detailedroute__route__drc_errors__iter:3": 7,
"detailedroute__route__drc_errors__iter:4": 0,
"detailedroute__route__net": 21209,
"detailedroute__route__net__special": 2,
"detailedroute__route__vias": 214163,
"detailedroute__route__vias__multicut": 0,
"detailedroute__route__vias__singlecut": 214163,
"detailedroute__route__wirelength": 115245,
"detailedroute__route__wirelength__iter:0": 116008,
"detailedroute__route__wirelength__iter:1": 115332,
"detailedroute__route__wirelength__iter:2": 115236,
"detailedroute__route__wirelength__iter:3": 115244,
"detailedroute__route__wirelength__iter:4": 115245,
"finish__clock__skew__hold": 137.921,
"finish__clock__skew__setup": 164.227,
"finish__cpu__total": 145.58,
"finish__design__core__area": 5654.27,
"finish__design__die__area": 6307.06,
"finish__design__instance__area": 2639.14,
"finish__design__instance__area__class:buffer": 234.067,
"finish__design__instance__area__class:clock_buffer": 52.765,
"finish__design__instance__area__class:clock_inverter": 9.27288,
"finish__design__instance__area__class:inverter": 81.4147,
"finish__design__instance__area__class:multi_input_combinational_cell": 1410.28,
"finish__design__instance__area__class:sequential_cell": 712.481,
"finish__design__instance__area__class:tie_cell": 72.7834,
"finish__design__instance__area__class:timing_repair_buffer": 37.4998,
"finish__design__instance__area__class:timing_repair_inverter": 0.11664,
"finish__design__instance__area__cover": 0,
"finish__design__instance__area__macros": 0,
"finish__design__instance__area__padcells": 0,
"finish__design__instance__area__stdcell": 2639.14,
"finish__design__instance__count": 21541,
"finish__design__instance__count__class:buffer": 1708,
"finish__design__instance__count__class:clock_buffer": 140,
"finish__design__instance__count__class:clock_inverter": 55,
"finish__design__instance__count__class:inverter": 1689,
"finish__design__instance__count__class:multi_input_combinational_cell": 12991,
"finish__design__instance__count__class:sequential_cell": 1932,
"finish__design__instance__count__class:tie_cell": 1664,
"finish__design__instance__count__class:timing_repair_buffer": 384,
"finish__design__instance__count__class:timing_repair_inverter": 2,
"finish__design__instance__count__cover": 0,
"finish__design__instance__count__macros": 0,
"finish__design__instance__count__padcells": 0,
"finish__design__instance__count__stdcell": 21541,
"finish__design__instance__utilization": 0.466752,
"finish__design__instance__utilization__stdcell": 0.466752,
"finish__design__io": 264,
"finish__design__rows": 278,
"finish__design__rows:asap7sc7p5t": 278,
"finish__design__sites": 387810,
"finish__design__sites:asap7sc7p5t": 387810,
"finish__design_powergrid__drop__average__net:VDD__corner:default": 0.7501,
"finish__design_powergrid__drop__average__net:VSS__corner:default": 0.0194608,
"finish__design_powergrid__drop__worst__net:VDD__corner:default": 0.052146,
"finish__design_powergrid__drop__worst__net:VSS__corner:default": 0.0505833,
"finish__design_powergrid__voltage__worst__net:VDD__corner:default": 0.717854,
"finish__design_powergrid__voltage__worst__net:VSS__corner:default": 0.0505833,
"finish__flow__errors__count": 0,
"finish__flow__warnings__count": 10,
"finish__mem__peak": 875068.0,
"finish__power__internal__total": 0.0205475,
"finish__power__leakage__total": 2.03126e-06,
"finish__power__switching__total": 0.0227261,
"finish__power__total": 0.0432756,
"finish__runtime__total": "2:26.72",
"finish__timing__drv__hold_violation_count": 0,
"finish__timing__drv__max_cap": 0,
"finish__timing__drv__max_cap_limit": 0.356024,
"finish__timing__drv__max_fanout": 0,
"finish__timing__drv__max_fanout_limit": 0,
"finish__timing__drv__max_slew": 45,
"finish__timing__drv__max_slew_limit": -0.331023,
"finish__timing__drv__setup_violation_count": 100,
"finish__timing__setup__tns": -2214.04,
"finish__timing__setup__ws": -64.3049,
"finish__timing__wns_percent_delay": -5.996886,
"finish_merge__cpu__total": 4.61,
"finish_merge__mem__peak": 559880.0,
"finish_merge__runtime__total": "0:05.07",
"floorplan__cpu__total": 585.48,
"floorplan__design__core__area": 5654.27,
"floorplan__design__die__area": 6307.06,
"floorplan__design__instance__area": 2276.04,
"floorplan__design__instance__area__cover": 0,
"floorplan__design__instance__area__macros": 0,
"floorplan__design__instance__area__padcells": 0,
"floorplan__design__instance__area__stdcell": 2276.04,
"floorplan__design__instance__count": 18331,
"floorplan__design__instance__count__cover": 0,
"floorplan__design__instance__count__hold_buffer": 0,
"floorplan__design__instance__count__macros": 0,
"floorplan__design__instance__count__padcells": 0,
"floorplan__design__instance__count__setup_buffer": 3,
"floorplan__design__instance__count__stdcell": 18331,
"floorplan__design__instance__utilization": 0.402535,
"floorplan__design__instance__utilization__stdcell": 0.402535,
"floorplan__design__io": 264,
"floorplan__design__rows": 278,
"floorplan__design__rows:asap7sc7p5t": 278,
"floorplan__design__sites": 387810,
"floorplan__design__sites:asap7sc7p5t": 387810,
"floorplan__flow__errors__count": 0,
"floorplan__flow__warnings__count": 484,
"floorplan__mem__peak": 3039120.0,
"floorplan__power__internal__total": 0.0178269,
"floorplan__power__leakage__total": 1.65498e-06,
"floorplan__power__switching__total": 0.0151741,
"floorplan__power__total": 0.0330026,
"floorplan__runtime__total": "9:47.66",
"floorplan__timing__setup__tns": 0,
"floorplan__timing__setup__ws": 0.170641,
"floorplan_io__cpu__total": 2.17,
"floorplan_io__mem__peak": 237568.0,
"floorplan_io__runtime__total": "0:02.36",
"floorplan_macro__cpu__total": 2.18,
"floorplan_macro__mem__peak": 237312.0,
"floorplan_macro__runtime__total": "0:02.39",
"floorplan_pdn__cpu__total": 2.51,
"floorplan_pdn__mem__peak": 241356.0,
"floorplan_pdn__runtime__total": "0:02.73",
"floorplan_tap__cpu__total": 2.07,
"floorplan_tap__mem__peak": 226816.0,
"floorplan_tap__runtime__total": "0:02.28",
"flow__errors__count": 0,
"flow__warnings__count": 10,
"globalplace__cpu__total": 1673.62,
"globalplace__design__core__area": 5654.27,
"globalplace__design__die__area": 6307.06,
"globalplace__design__instance__area": 2471.43,
"globalplace__design__instance__area__cover": 0,
"globalplace__design__instance__area__macros": 0,
"globalplace__design__instance__area__padcells": 0,
"globalplace__design__instance__area__stdcell": 2471.43,
"globalplace__design__instance__count": 19330,
"globalplace__design__instance__count__cover": 0,
"globalplace__design__instance__count__macros": 0,
"globalplace__design__instance__count__padcells": 0,
"globalplace__design__instance__count__stdcell": 19330,
"globalplace__design__instance__utilization": 0.43709,
"globalplace__design__instance__utilization__stdcell": 0.43709,
"globalplace__design__io": 264,
"globalplace__design__rows": 278,
"globalplace__design__rows:asap7sc7p5t": 278,
"globalplace__design__sites": 387810,
"globalplace__design__sites:asap7sc7p5t": 387810,
"globalplace__flow__errors__count": 0,
"globalplace__flow__warnings__count": 10,
"globalplace__mem__peak": 3478984.0,
"globalplace__power__internal__total": 0.018272,
"globalplace__power__leakage__total": 1.94505e-06,
"globalplace__power__switching__total": 0.0201947,
"globalplace__power__total": 0.0384687,
"globalplace__runtime__total": "6:32.04",
"globalplace__timing__setup__tns": -25495.9,
"globalplace__timing__setup__ws": -166.769,
"globalplace_io__cpu__total": 2.18,
"globalplace_io__mem__peak": 240640.0,
"globalplace_io__runtime__total": "0:02.39",
"globalplace_skip_io__cpu__total": 981.75,
"globalplace_skip_io__mem__peak": 273736.0,
"globalplace_skip_io__runtime__total": "1:25.45",
"globalroute__antenna__violating__nets": 0,
"globalroute__antenna__violating__pins": 0,
"globalroute__antenna_diodes_count": 0,
"globalroute__clock__skew__hold": 133.021,
"globalroute__clock__skew__setup": 159.792,
"globalroute__cpu__total": 129.62,
"globalroute__design__core__area": 5654.27,
"globalroute__design__die__area": 6307.06,
"globalroute__design__instance__area": 2639.14,
"globalroute__design__instance__area__cover": 0,
"globalroute__design__instance__area__macros": 0,
"globalroute__design__instance__area__padcells": 0,
"globalroute__design__instance__area__stdcell": 2639.14,
"globalroute__design__instance__count": 21541,
"globalroute__design__instance__count__cover": 0,
"globalroute__design__instance__count__hold_buffer": 0,
"globalroute__design__instance__count__macros": 0,
"globalroute__design__instance__count__padcells": 0,
"globalroute__design__instance__count__setup_buffer": 15,
"globalroute__design__instance__count__stdcell": 21541,
"globalroute__design__instance__displacement__max": 0.648,
"globalroute__design__instance__displacement__mean": 0.001,
"globalroute__design__instance__displacement__total": 25.38,
"globalroute__design__instance__utilization": 0.466752,
"globalroute__design__instance__utilization__stdcell": 0.466752,
"globalroute__design__io": 264,
"globalroute__design__rows": 278,
"globalroute__design__rows:asap7sc7p5t": 278,
"globalroute__design__sites": 387810,
"globalroute__design__sites:asap7sc7p5t": 387810,
"globalroute__design__violations": 0,
"globalroute__flow__errors__count": 0,
"globalroute__flow__warnings__count": 12,
"globalroute__mem__peak": 897216.0,
"globalroute__power__internal__total": 0.0204573,
"globalroute__power__leakage__total": 2.03126e-06,
"globalroute__power__switching__total": 0.0224408,
"globalroute__power__total": 0.0429002,
"globalroute__route__wirelength__estimated": 94576,
"globalroute__runtime__total": "1:44.99",
"globalroute__timing__clock__slack": -43.838,
"globalroute__timing__drv__hold_violation_count": 0,
"globalroute__timing__drv__max_cap": 0,
"globalroute__timing__drv__max_cap_limit": 0.419739,
"globalroute__timing__drv__max_fanout": 0,
"globalroute__timing__drv__max_fanout_limit": 0,
"globalroute__timing__drv__max_slew": 0,
"globalroute__timing__drv__max_slew_limit": 0.196596,
"globalroute__timing__drv__setup_violation_count": 36,
"globalroute__timing__setup__tns": -764.286,
"globalroute__timing__setup__ws": -43.8383,
"placeopt__cpu__total": 140.63,
"placeopt__design__core__area": 5654.27,
"placeopt__design__die__area": 6307.06,
"placeopt__design__instance__area": 2564.9,
"placeopt__design__instance__area__cover": 0,
"placeopt__design__instance__area__macros": 0,
"placeopt__design__instance__area__padcells": 0,
"placeopt__design__instance__area__stdcell": 2564.9,
"placeopt__design__instance__count": 21241,
"placeopt__design__instance__count__cover": 0,
"placeopt__design__instance__count__macros": 0,
"placeopt__design__instance__count__padcells": 0,
"placeopt__design__instance__count__stdcell": 21241,
"placeopt__design__instance__utilization": 0.453622,
"placeopt__design__instance__utilization__stdcell": 0.453622,
"placeopt__design__io": 264,
"placeopt__design__rows": 278,
"placeopt__design__rows:asap7sc7p5t": 278,
"placeopt__design__sites": 387810,
"placeopt__design__sites:asap7sc7p5t": 387810,
"placeopt__flow__errors__count": 0,
"placeopt__flow__warnings__count": 10,
"placeopt__mem__peak": 1233200.0,
"placeopt__power__internal__total": 0.0186429,
"placeopt__power__leakage__total": 1.96045e-06,
"placeopt__power__switching__total": 0.0203373,
"placeopt__power__total": 0.0389822,
"placeopt__runtime__total": "2:21.47",
"placeopt__timing__drv__floating__nets": 0,
"placeopt__timing__drv__floating__pins": 0,
"placeopt__timing__drv__hold_violation_count": 0,
"placeopt__timing__drv__max_cap": 0,
"placeopt__timing__drv__max_cap_limit": 0.427192,
"placeopt__timing__drv__max_fanout": 0,
"placeopt__timing__drv__max_fanout_limit": 0,
"placeopt__timing__drv__max_slew": 0,
"placeopt__timing__drv__max_slew_limit": 0.0543873,
"placeopt__timing__drv__setup_violation_count": 255,
"placeopt__timing__setup__tns": -25503.4,
"placeopt__timing__setup__ws": -166.534,
"run__flow__design": "ibex",
"run__flow__generate_date": "2025-01-28 11:14",
"run__flow__metrics_version": "Metrics_2.1.2",
"run__flow__openroad_commit": "N/A",
"run__flow__openroad_version": "6d69029d9813cb8f1c0e3c1dce919cead101a2c5",
"run__flow__platform": "asap7",
"run__flow__platform__capacitance_units": "1fF",
"run__flow__platform__current_units": "1mA",
"run__flow__platform__distance_units": "1um",
"run__flow__platform__power_units": "1pW",
"run__flow__platform__resistance_units": "1kohm",
"run__flow__platform__time_units": "1ps",
"run__flow__platform__voltage_units": "1v",
"run__flow__platform_commit": "6217504d39d7f0785e87380673de9e8264e1f955",
"run__flow__scripts_commit": "6217504d39d7f0785e87380673de9e8264e1f955",
"run__flow__uuid": "17dde336-608c-44d7-983e-7d37057dcfc3",
"run__flow__variant": "base",
"synth__cpu__total": 58.31,
"synth__design__instance__area__stdcell": 2275.12152,
"synth__design__instance__count__stdcell": 18332.0,
"synth__mem__peak": 194816.0,
"synth__runtime__total": "0:58.69",
"total_time": "0:29:21.790000"
}

View File

@ -1,70 +0,0 @@
{
"synth__design__instance__area__stdcell": {
"value": 2616.39,
"compare": "<="
},
"constraints__clocks__count": {
"value": 1,
"compare": "=="
},
"placeopt__design__instance__area": {
"value": 2950,
"compare": "<="
},
"placeopt__design__instance__count__stdcell": {
"value": 24427,
"compare": "<="
},
"detailedplace__design__violations": {
"value": 0,
"compare": "=="
},
"cts__design__instance__count__setup_buffer": {
"value": 2124,
"compare": "<="
},
"cts__design__instance__count__hold_buffer": {
"value": 2124,
"compare": "<="
},
"globalroute__antenna_diodes_count": {
"value": 0,
"compare": "<="
},
"detailedroute__route__wirelength": {
"value": 132532,
"compare": "<="
},
"detailedroute__route__drc_errors": {
"value": 0,
"compare": "<="
},
"detailedroute__antenna__violating__nets": {
"value": 0,
"compare": "<="
},
"detailedroute__antenna_diodes_count": {
"value": 0,
"compare": "<="
},
"finish__timing__setup__ws": {
"value": -127.02,
"compare": ">="
},
"finish__design__instance__area": {
"value": 3035,
"compare": "<="
},
"finish__timing__drv__setup_violation_count": {
"value": 1062,
"compare": "<="
},
"finish__timing__drv__hold_violation_count": {
"value": 100,
"compare": "<="
},
"finish__timing__wns_percent_delay": {
"value": -17.16,
"compare": ">="
}
}

View File

@ -1,5 +0,0 @@
filegroup(
name = "verilog",
srcs = glob(include = ["*.v"]),
visibility = ["//visibility:public"],
)

View File

@ -1,755 +0,0 @@
//-----------------------------------------------------------------------------
// GcdUnit
//-----------------------------------------------------------------------------
//
// Originally Generated from PyMTL with a few modifications to make it more
// friendly to OpenROAD tools
//module GcdUnit
module gcd
(
input wire clk,
input wire [ 31:0] req_msg,
output wire req_rdy,
input wire req_val,
input wire reset,
output wire [ 15:0] resp_msg,
input wire resp_rdy,
output wire resp_val
);
// ctrl temporaries
wire [ 0:0] ctrl$is_b_zero;
wire [ 0:0] ctrl$resp_rdy;
wire [ 0:0] ctrl$clk;
wire [ 0:0] ctrl$is_a_lt_b;
wire [ 0:0] ctrl$req_val;
wire [ 0:0] ctrl$reset;
wire [ 1:0] ctrl$a_mux_sel;
wire [ 0:0] ctrl$resp_val;
wire [ 0:0] ctrl$b_mux_sel;
wire [ 0:0] ctrl$b_reg_en;
wire [ 0:0] ctrl$a_reg_en;
wire [ 0:0] ctrl$req_rdy;
GcdUnitCtrlRTL_0x4d0fc71ead8d3d9e ctrl
(
.is_b_zero ( ctrl$is_b_zero ),
.resp_rdy ( ctrl$resp_rdy ),
.clk ( ctrl$clk ),
.is_a_lt_b ( ctrl$is_a_lt_b ),
.req_val ( ctrl$req_val ),
.reset ( ctrl$reset ),
.a_mux_sel ( ctrl$a_mux_sel ),
.resp_val ( ctrl$resp_val ),
.b_mux_sel ( ctrl$b_mux_sel ),
.b_reg_en ( ctrl$b_reg_en ),
.a_reg_en ( ctrl$a_reg_en ),
.req_rdy ( ctrl$req_rdy )
);
// dpath temporaries
wire [ 1:0] dpath$a_mux_sel;
wire [ 0:0] dpath$clk;
wire [ 15:0] dpath$req_msg_b;
wire [ 15:0] dpath$req_msg_a;
wire [ 0:0] dpath$b_mux_sel;
wire [ 0:0] dpath$reset;
wire [ 0:0] dpath$b_reg_en;
wire [ 0:0] dpath$a_reg_en;
wire [ 0:0] dpath$is_b_zero;
wire [ 15:0] dpath$resp_msg;
wire [ 0:0] dpath$is_a_lt_b;
GcdUnitDpathRTL_0x4d0fc71ead8d3d9e dpath
(
.a_mux_sel ( dpath$a_mux_sel ),
.clk ( dpath$clk ),
.req_msg_b ( dpath$req_msg_b ),
.req_msg_a ( dpath$req_msg_a ),
.b_mux_sel ( dpath$b_mux_sel ),
.reset ( dpath$reset ),
.b_reg_en ( dpath$b_reg_en ),
.a_reg_en ( dpath$a_reg_en ),
.is_b_zero ( dpath$is_b_zero ),
.resp_msg ( dpath$resp_msg ),
.is_a_lt_b ( dpath$is_a_lt_b )
);
// signal connections
assign ctrl$clk = clk;
assign ctrl$is_a_lt_b = dpath$is_a_lt_b;
assign ctrl$is_b_zero = dpath$is_b_zero;
assign ctrl$req_val = req_val;
assign ctrl$reset = reset;
assign ctrl$resp_rdy = resp_rdy;
assign dpath$a_mux_sel = ctrl$a_mux_sel;
assign dpath$a_reg_en = ctrl$a_reg_en;
assign dpath$b_mux_sel = ctrl$b_mux_sel;
assign dpath$b_reg_en = ctrl$b_reg_en;
assign dpath$clk = clk;
assign dpath$req_msg_a = req_msg[31:16];
assign dpath$req_msg_b = req_msg[15:0];
assign dpath$reset = reset;
assign req_rdy = ctrl$req_rdy;
assign resp_msg = dpath$resp_msg;
assign resp_val = ctrl$resp_val;
endmodule // GcdUnit
//-----------------------------------------------------------------------------
// GcdUnitCtrlRTL_0x4d0fc71ead8d3d9e
//-----------------------------------------------------------------------------
module GcdUnitCtrlRTL_0x4d0fc71ead8d3d9e
(
output reg [ 1:0] a_mux_sel,
output reg [ 0:0] a_reg_en,
output reg [ 0:0] b_mux_sel,
output reg [ 0:0] b_reg_en,
input wire [ 0:0] clk,
input wire [ 0:0] is_a_lt_b,
input wire [ 0:0] is_b_zero,
output reg [ 0:0] req_rdy,
input wire [ 0:0] req_val,
input wire [ 0:0] reset,
input wire [ 0:0] resp_rdy,
output reg [ 0:0] resp_val
);
// register declarations
reg [ 1:0] curr_state__0;
reg [ 1:0] current_state__1;
reg [ 0:0] do_sub;
reg [ 0:0] do_swap;
reg [ 1:0] next_state__0;
reg [ 1:0] state$in_;
// localparam declarations
localparam A_MUX_SEL_B = 2;
localparam A_MUX_SEL_IN = 0;
localparam A_MUX_SEL_SUB = 1;
localparam A_MUX_SEL_X = 0;
localparam B_MUX_SEL_A = 0;
localparam B_MUX_SEL_IN = 1;
localparam B_MUX_SEL_X = 0;
localparam STATE_CALC = 1;
localparam STATE_DONE = 2;
localparam STATE_IDLE = 0;
// state temporaries
wire [ 0:0] state$reset;
wire [ 0:0] state$clk;
wire [ 1:0] state$out;
RegRst_0x9f365fdf6c8998a state
(
.reset ( state$reset ),
.in_ ( state$in_ ),
.clk ( state$clk ),
.out ( state$out )
);
// signal connections
assign state$clk = clk;
assign state$reset = reset;
// PYMTL SOURCE:
//
// @s.combinational
// def state_transitions():
//
// curr_state = s.state.out
// next_state = s.state.out
//
// # Transistions out of IDLE state
//
// if ( curr_state == s.STATE_IDLE ):
// if ( s.req_val and s.req_rdy ):
// next_state = s.STATE_CALC
//
// # Transistions out of CALC state
//
// if ( curr_state == s.STATE_CALC ):
// if ( not s.is_a_lt_b and s.is_b_zero ):
// next_state = s.STATE_DONE
//
// # Transistions out of DONE state
//
// if ( curr_state == s.STATE_DONE ):
// if ( s.resp_val and s.resp_rdy ):
// next_state = s.STATE_IDLE
//
// s.state.in_.value = next_state
// logic for state_transitions()
always @ (*) begin
curr_state__0 = state$out;
next_state__0 = state$out;
if ((curr_state__0 == STATE_IDLE)) begin
if ((req_val&&req_rdy)) begin
next_state__0 = STATE_CALC;
end
else begin
end
end
else begin
end
if ((curr_state__0 == STATE_CALC)) begin
if ((!is_a_lt_b&&is_b_zero)) begin
next_state__0 = STATE_DONE;
end
else begin
end
end
else begin
end
if ((curr_state__0 == STATE_DONE)) begin
if ((resp_val&&resp_rdy)) begin
next_state__0 = STATE_IDLE;
end
else begin
end
end
else begin
end
state$in_ = next_state__0;
end
// PYMTL SOURCE:
//
// @s.combinational
// def state_outputs():
//
// current_state = s.state.out
//
// # In IDLE state we simply wait for inputs to arrive and latch them
//
// if current_state == s.STATE_IDLE:
// s.req_rdy.value = 1
// s.resp_val.value = 0
// s.a_mux_sel.value = A_MUX_SEL_IN
// s.a_reg_en.value = 1
// s.b_mux_sel.value = B_MUX_SEL_IN
// s.b_reg_en.value = 1
//
// # In CALC state we iteratively swap/sub to calculate GCD
//
// elif current_state == s.STATE_CALC:
//
// s.do_swap.value = s.is_a_lt_b
// s.do_sub.value = ~s.is_b_zero
//
// s.req_rdy.value = 0
// s.resp_val.value = 0
// s.a_mux_sel.value = A_MUX_SEL_B if s.do_swap else A_MUX_SEL_SUB
// s.a_reg_en.value = 1
// s.b_mux_sel.value = B_MUX_SEL_A
// s.b_reg_en.value = s.do_swap
//
// # In DONE state we simply wait for output transaction to occur
//
// elif current_state == s.STATE_DONE:
// s.req_rdy.value = 0
// s.resp_val.value = 1
// s.a_mux_sel.value = A_MUX_SEL_X
// s.a_reg_en.value = 0
// s.b_mux_sel.value = B_MUX_SEL_X
// s.b_reg_en.value = 0
//
// # Default case that we should not hit
//
// else:
// s.req_rdy.value = 0
// s.resp_val.value = 0
// s.a_mux_sel.value = A_MUX_SEL_X
// s.a_reg_en.value = 0
// s.b_mux_sel.value = B_MUX_SEL_X
// s.b_reg_en.value = 0
// logic for state_outputs()
always @ (*) begin
current_state__1 = state$out;
if ((current_state__1 == STATE_IDLE)) begin
req_rdy = 1;
resp_val = 0;
a_mux_sel = A_MUX_SEL_IN;
a_reg_en = 1;
b_mux_sel = B_MUX_SEL_IN;
b_reg_en = 1;
end
else begin
if ((current_state__1 == STATE_CALC)) begin
do_swap = is_a_lt_b;
do_sub = ~is_b_zero;
req_rdy = 0;
resp_val = 0;
a_mux_sel = do_swap ? A_MUX_SEL_B : A_MUX_SEL_SUB;
a_reg_en = 1;
b_mux_sel = B_MUX_SEL_A;
b_reg_en = do_swap;
end
else begin
if ((current_state__1 == STATE_DONE)) begin
req_rdy = 0;
resp_val = 1;
a_mux_sel = A_MUX_SEL_X;
a_reg_en = 0;
b_mux_sel = B_MUX_SEL_X;
b_reg_en = 0;
end
else begin
req_rdy = 0;
resp_val = 0;
a_mux_sel = A_MUX_SEL_X;
a_reg_en = 0;
b_mux_sel = B_MUX_SEL_X;
b_reg_en = 0;
end
end
end
end
endmodule // GcdUnitCtrlRTL_0x4d0fc71ead8d3d9e
//-----------------------------------------------------------------------------
// RegRst_0x9f365fdf6c8998a
//-----------------------------------------------------------------------------
// dtype: 2
// reset_value: 0
module RegRst_0x9f365fdf6c8998a
(
input wire [ 0:0] clk,
input wire [ 1:0] in_,
output reg [ 1:0] out,
input wire [ 0:0] reset
);
// localparam declarations
localparam reset_value = 0;
// PYMTL SOURCE:
//
// @s.posedge_clk
// def seq_logic():
// if s.reset:
// s.out.next = reset_value
// else:
// s.out.next = s.in_
// logic for seq_logic()
always @ (posedge clk) begin
if (reset) begin
out <= reset_value;
end
else begin
out <= in_;
end
end
endmodule // RegRst_0x9f365fdf6c8998a
//-----------------------------------------------------------------------------
// GcdUnitDpathRTL_0x4d0fc71ead8d3d9e
//-----------------------------------------------------------------------------
module GcdUnitDpathRTL_0x4d0fc71ead8d3d9e
(
input wire [ 1:0] a_mux_sel,
input wire [ 0:0] a_reg_en,
input wire [ 0:0] b_mux_sel,
input wire [ 0:0] b_reg_en,
input wire [ 0:0] clk,
output wire [ 0:0] is_a_lt_b,
output wire [ 0:0] is_b_zero,
input wire [ 15:0] req_msg_a,
input wire [ 15:0] req_msg_b,
input wire [ 0:0] reset,
output wire [ 15:0] resp_msg
);
// wire declarations
wire [ 15:0] sub_out;
wire [ 15:0] b_reg_out;
// a_reg temporaries
wire [ 0:0] a_reg$reset;
wire [ 15:0] a_reg$in_;
wire [ 0:0] a_reg$clk;
wire [ 0:0] a_reg$en;
wire [ 15:0] a_reg$out;
RegEn_0x68db79c4ec1d6e5b a_reg
(
.reset ( a_reg$reset ),
.in_ ( a_reg$in_ ),
.clk ( a_reg$clk ),
.en ( a_reg$en ),
.out ( a_reg$out )
);
// a_lt_b temporaries
wire [ 0:0] a_lt_b$reset;
wire [ 0:0] a_lt_b$clk;
wire [ 15:0] a_lt_b$in0;
wire [ 15:0] a_lt_b$in1;
wire [ 0:0] a_lt_b$out;
LtComparator_0x422b1f52edd46a85 a_lt_b
(
.reset ( a_lt_b$reset ),
.clk ( a_lt_b$clk ),
.in0 ( a_lt_b$in0 ),
.in1 ( a_lt_b$in1 ),
.out ( a_lt_b$out )
);
// b_zero temporaries
wire [ 0:0] b_zero$reset;
wire [ 15:0] b_zero$in_;
wire [ 0:0] b_zero$clk;
wire [ 0:0] b_zero$out;
ZeroComparator_0x422b1f52edd46a85 b_zero
(
.reset ( b_zero$reset ),
.in_ ( b_zero$in_ ),
.clk ( b_zero$clk ),
.out ( b_zero$out )
);
// a_mux temporaries
wire [ 0:0] a_mux$reset;
wire [ 15:0] a_mux$in_$000;
wire [ 15:0] a_mux$in_$001;
wire [ 15:0] a_mux$in_$002;
wire [ 0:0] a_mux$clk;
wire [ 1:0] a_mux$sel;
wire [ 15:0] a_mux$out;
Mux_0x683fa1a418b072c9 a_mux
(
.reset ( a_mux$reset ),
.in_$000 ( a_mux$in_$000 ),
.in_$001 ( a_mux$in_$001 ),
.in_$002 ( a_mux$in_$002 ),
.clk ( a_mux$clk ),
.sel ( a_mux$sel ),
.out ( a_mux$out )
);
// b_mux temporaries
wire [ 0:0] b_mux$reset;
wire [ 15:0] b_mux$in_$000;
wire [ 15:0] b_mux$in_$001;
wire [ 0:0] b_mux$clk;
wire [ 0:0] b_mux$sel;
wire [ 15:0] b_mux$out;
Mux_0xdd6473406d1a99a b_mux
(
.reset ( b_mux$reset ),
.in_$000 ( b_mux$in_$000 ),
.in_$001 ( b_mux$in_$001 ),
.clk ( b_mux$clk ),
.sel ( b_mux$sel ),
.out ( b_mux$out )
);
// sub temporaries
wire [ 0:0] sub$reset;
wire [ 0:0] sub$clk;
wire [ 15:0] sub$in0;
wire [ 15:0] sub$in1;
wire [ 15:0] sub$out;
Subtractor_0x422b1f52edd46a85 sub
(
.reset ( sub$reset ),
.clk ( sub$clk ),
.in0 ( sub$in0 ),
.in1 ( sub$in1 ),
.out ( sub$out )
);
// b_reg temporaries
wire [ 0:0] b_reg$reset;
wire [ 15:0] b_reg$in_;
wire [ 0:0] b_reg$clk;
wire [ 0:0] b_reg$en;
wire [ 15:0] b_reg$out;
RegEn_0x68db79c4ec1d6e5b b_reg
(
.reset ( b_reg$reset ),
.in_ ( b_reg$in_ ),
.clk ( b_reg$clk ),
.en ( b_reg$en ),
.out ( b_reg$out )
);
// signal connections
assign a_lt_b$clk = clk;
assign a_lt_b$in0 = a_reg$out;
assign a_lt_b$in1 = b_reg$out;
assign a_lt_b$reset = reset;
assign a_mux$clk = clk;
assign a_mux$in_$000 = req_msg_a;
assign a_mux$in_$001 = sub_out;
assign a_mux$in_$002 = b_reg_out;
assign a_mux$reset = reset;
assign a_mux$sel = a_mux_sel;
assign a_reg$clk = clk;
assign a_reg$en = a_reg_en;
assign a_reg$in_ = a_mux$out;
assign a_reg$reset = reset;
assign b_mux$clk = clk;
assign b_mux$in_$000 = a_reg$out;
assign b_mux$in_$001 = req_msg_b;
assign b_mux$reset = reset;
assign b_mux$sel = b_mux_sel;
assign b_reg$clk = clk;
assign b_reg$en = b_reg_en;
assign b_reg$in_ = b_mux$out;
assign b_reg$reset = reset;
assign b_reg_out = b_reg$out;
assign b_zero$clk = clk;
assign b_zero$in_ = b_reg$out;
assign b_zero$reset = reset;
assign is_a_lt_b = a_lt_b$out;
assign is_b_zero = b_zero$out;
assign resp_msg = sub$out;
assign sub$clk = clk;
assign sub$in0 = a_reg$out;
assign sub$in1 = b_reg$out;
assign sub$reset = reset;
assign sub_out = sub$out;
endmodule // GcdUnitDpathRTL_0x4d0fc71ead8d3d9e
//-----------------------------------------------------------------------------
// RegEn_0x68db79c4ec1d6e5b
//-----------------------------------------------------------------------------
// dtype: 16
module RegEn_0x68db79c4ec1d6e5b
(
input wire [ 0:0] clk,
input wire [ 0:0] en,
input wire [ 15:0] in_,
output reg [ 15:0] out,
input wire [ 0:0] reset
);
// PYMTL SOURCE:
//
// @s.posedge_clk
// def seq_logic():
// if s.en:
// s.out.next = s.in_
// logic for seq_logic()
always @ (posedge clk) begin
if (en) begin
out <= in_;
end
else begin
end
end
endmodule // RegEn_0x68db79c4ec1d6e5b
//-----------------------------------------------------------------------------
// LtComparator_0x422b1f52edd46a85
//-----------------------------------------------------------------------------
// nbits: 16
module LtComparator_0x422b1f52edd46a85
(
input wire [ 0:0] clk,
input wire [ 15:0] in0,
input wire [ 15:0] in1,
output reg [ 0:0] out,
input wire [ 0:0] reset
);
// PYMTL SOURCE:
//
// @s.combinational
// def comb_logic():
// s.out.value = s.in0 < s.in1
// logic for comb_logic()
always @ (*) begin
out = (in0 < in1);
end
endmodule // LtComparator_0x422b1f52edd46a85
//-----------------------------------------------------------------------------
// ZeroComparator_0x422b1f52edd46a85
//-----------------------------------------------------------------------------
// nbits: 16
module ZeroComparator_0x422b1f52edd46a85
(
input wire [ 0:0] clk,
input wire [ 15:0] in_,
output reg [ 0:0] out,
input wire [ 0:0] reset
);
// PYMTL SOURCE:
//
// @s.combinational
// def comb_logic():
// s.out.value = s.in_ == 0
// logic for comb_logic()
always @ (*) begin
out = (in_ == 0);
end
endmodule // ZeroComparator_0x422b1f52edd46a85
//-----------------------------------------------------------------------------
// Mux_0x683fa1a418b072c9
//-----------------------------------------------------------------------------
// dtype: 16
// nports: 3
module Mux_0x683fa1a418b072c9
(
input wire [ 0:0] clk,
input wire [ 15:0] in_$000,
input wire [ 15:0] in_$001,
input wire [ 15:0] in_$002,
output reg [ 15:0] out,
input wire [ 0:0] reset,
input wire [ 1:0] sel
);
// localparam declarations
localparam nports = 3;
// array declarations
wire [ 15:0] in_[0:2];
assign in_[ 0] = in_$000;
assign in_[ 1] = in_$001;
assign in_[ 2] = in_$002;
// PYMTL SOURCE:
//
// @s.combinational
// def comb_logic():
// assert s.sel < nports
// s.out.v = s.in_[ s.sel ]
// logic for comb_logic()
always @ (*) begin
out = in_[sel];
end
endmodule // Mux_0x683fa1a418b072c9
//-----------------------------------------------------------------------------
// Mux_0xdd6473406d1a99a
//-----------------------------------------------------------------------------
// dtype: 16
// nports: 2
module Mux_0xdd6473406d1a99a
(
input wire [ 0:0] clk,
input wire [ 15:0] in_$000,
input wire [ 15:0] in_$001,
output reg [ 15:0] out,
input wire [ 0:0] reset,
input wire [ 0:0] sel
);
// localparam declarations
localparam nports = 2;
// array declarations
wire [ 15:0] in_[0:1];
assign in_[ 0] = in_$000;
assign in_[ 1] = in_$001;
// PYMTL SOURCE:
//
// @s.combinational
// def comb_logic():
// assert s.sel < nports
// s.out.v = s.in_[ s.sel ]
// logic for comb_logic()
always @ (*) begin
out = in_[sel];
end
endmodule // Mux_0xdd6473406d1a99a
//-----------------------------------------------------------------------------
// Subtractor_0x422b1f52edd46a85
//-----------------------------------------------------------------------------
// nbits: 16
module Subtractor_0x422b1f52edd46a85
(
input wire [ 0:0] clk,
input wire [ 15:0] in0,
input wire [ 15:0] in1,
output reg [ 15:0] out,
input wire [ 0:0] reset
);
// PYMTL SOURCE:
//
// @s.combinational
// def comb_logic():
// s.out.value = s.in0 - s.in1
// logic for comb_logic()
always @ (*) begin
out = (in0-in1);
end
endmodule // Subtractor_0x422b1f52edd46a85

View File

@ -1,14 +0,0 @@
read_liberty $::env(LIB_DIR)/asap7sc7p5t_AO_RVT_FF_nldm_211120.lib.gz
read_liberty $::env(LIB_DIR)/asap7sc7p5t_INVBUF_RVT_FF_nldm_220122.lib.gz
read_liberty $::env(LIB_DIR)/asap7sc7p5t_OA_RVT_FF_nldm_211120.lib.gz
read_liberty $::env(LIB_DIR)/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz
read_liberty $::env(LIB_DIR)/asap7sc7p5t_SEQ_RVT_FF_nldm_220123.lib
read_verilog 1_synth.v
link_design gcd
read_sdc 1_synth.sdc
read_saif -scope gcd simx.saif
report_power
exit