waynet0000
Newbie level 4
Hello,
I am new here and new to logic design. I am currently doing some project using Synopsys Design Compiler and have some questions about its retiming function. If you have help me, I would very appreciate. Thank you in advance.
The problem is very simple. I am synthesizing a 8*8 multiplier using "optimize_registers" command. But DC reports following warning:
Warning: The following registers are considered to be
'fixed' during retiming. They are end-points of timing exceptions
such as 'set_false_path'. (RTDC-34)
a8_reg[0] (DFFSSRX1)
a8_reg[1] (DFFSSRX1)
a8_reg[2] (DFFSSRX1)
......
In my verilog, I basically put 8 registers in series at the inputs. I don't know those registers can not be moved and why there are timing exceptions.
Here is my verilog code:
module mult (clk, rstN, a , b, c);
parameter DATA_WIDTH = 8;
input clk,rstN;
input [DATA_WIDTH-1:0] a, b;
output [2*DATA_WIDTH-1:0] c;
reg [DATA_WIDTH-1:0] a1,a2,a3,a4,b1,b2,b3,b4;
reg [DATA_WIDTH-1:0] a5,a6,a7,a8,b5,b6,b7,b8;
assign c = a8 * b8;
//synopsys sync_set_reset "rstN"
always@(posedge clk)
if (!rstN) begin
a1<=0; a2<=0;
b1<=0; b2<=0;
a3<=0; a4<=0;
b3<=0; b4<=0;
a5<=0; a6<=0;
b5<=0; b6<=0;
a7<=0; a8<=0;
b7<=0; b8<=0;
end
else begin
a1<=a; b1<=b;
a2<=a1; b2<=b1;
a3<=a2; b3<=b2;
a4<=a3; b4<=b3;
a5<=a4; b5<=b4;
a6<=a5; b6<=b5;
a7<=a6; b7<=b6;
a8<=a7; b8<=b7;
end
endmodule
I am new here and new to logic design. I am currently doing some project using Synopsys Design Compiler and have some questions about its retiming function. If you have help me, I would very appreciate. Thank you in advance.
The problem is very simple. I am synthesizing a 8*8 multiplier using "optimize_registers" command. But DC reports following warning:
Warning: The following registers are considered to be
'fixed' during retiming. They are end-points of timing exceptions
such as 'set_false_path'. (RTDC-34)
a8_reg[0] (DFFSSRX1)
a8_reg[1] (DFFSSRX1)
a8_reg[2] (DFFSSRX1)
......
In my verilog, I basically put 8 registers in series at the inputs. I don't know those registers can not be moved and why there are timing exceptions.
Here is my verilog code:
module mult (clk, rstN, a , b, c);
parameter DATA_WIDTH = 8;
input clk,rstN;
input [DATA_WIDTH-1:0] a, b;
output [2*DATA_WIDTH-1:0] c;
reg [DATA_WIDTH-1:0] a1,a2,a3,a4,b1,b2,b3,b4;
reg [DATA_WIDTH-1:0] a5,a6,a7,a8,b5,b6,b7,b8;
assign c = a8 * b8;
//synopsys sync_set_reset "rstN"
always@(posedge clk)
if (!rstN) begin
a1<=0; a2<=0;
b1<=0; b2<=0;
a3<=0; a4<=0;
b3<=0; b4<=0;
a5<=0; a6<=0;
b5<=0; b6<=0;
a7<=0; a8<=0;
b7<=0; b8<=0;
end
else begin
a1<=a; b1<=b;
a2<=a1; b2<=b1;
a3<=a2; b3<=b2;
a4<=a3; b4<=b3;
a5<=a4; b5<=b4;
a6<=a5; b6<=b5;
a7<=a6; b7<=b6;
a8<=a7; b8<=b7;
end
endmodule