( ESNUG 383 Item 12 ) ------------------------------------------- [11/28/01]
From: Rudolf Usselmann <rudi@asics.ws>
Subject: How Can I Coax DC To Intelligently Duplicate High Fanout Nets?
Hi John!
I'm having trouble getting Design Compiler to do what I'm thinking -- not
what I'm writing. ;) Well almost! Basically I have the following code:
always @(posedge clk)
sig_del1 <= #1 sig_in;
always @(posedge clk)
sig_del2 <= #1 sig_del1;
always @(sig_sel2 or data_a or data_b)
if(sig_del2) dout = data_a;
else dout = data_b;
In this example, the data bus is 64 bits wide, and sig_del2 is driving 64
2:1 MUXes (or equivalent). This means sig_del2 is my critical path due to
high fanout. I tried to limit the fanout by setting set_max_fanout, in
which case DC inserts a buffer tree. However, what I really would like
to see DC do is something like this:
always @(posedge clk)
sig_del1 <= #1 sig_in;
always @(posedge clk)
sig_del2_0 <= #1 sig_del1;
always @(posedge clk)
sig_del2_1 <= #1 sig_del1;
always @(posedge clk)
sig_del2_2 <= #1 sig_del1;
always @(posedge clk)
sig_del2_3 <= #1 sig_del1;
always @(sig_sel2_0 or data_a or data_b)
if(sig_del2_0) dout[15:00] = data_a[15:00];
else dout[15:00] = data_b[15:00];
always @(sig_sel2_1 or data_a or data_b)
if(sig_del2_1) dout[31:16] = data_a[31:16];
else dout[31:16] = data_b[31:16];
always @(sig_sel2_2 or data_a or data_b)
if(sig_del2_2) dout[47:32] = data_a[47:32];
else dout[47:32] = data_b[47:32];
always @(sig_sel2_3 or data_a or data_b)
if(sig_del2_3) dout[63:48] = data_a[63:48];
else dout[63:48] = data_b[63:48];
In this example I have reduced the fanout from 64 to 16, without inserting
buffers. I do have a DC-Ultra license which is required for re-timing. But
DC still can't read my mind... :*(
So how can I do the above optimization automatically? Maybe it would be
even better to reduce the fanout to 8. DC should be able to figure this
out. Any pointers appreciated !
- Rudi Usselmann
|
|