【有偿追加,求专家解答!】对这段代码用Astro进行layout,用redhawk进行ir drop 的测试和分析,以及降低ir drop 的方法和实现
module TopModule_Xor_RanGen (Clk,Rst,En,SW,Apwd,Kpwd,Seg1,Seg2,Seg3,Seg4);
input Clk,Rst,En,SW;
input [31:0]Apwd,Kpwd;
output [6:0]Seg1,Seg2,Seg3,Seg4;
// output [15:0]Pad1,Pad2,CCPwdM,CCPwdL;
wire [15:0]Pad1,Pad2,CCPwdM,CCPwdL;
wire [15:0]RT_In,RM_In;
lfsr_counter RM (
.clk(Clk),
.reset(Rst),
.enable(En),
.lfsr_output(RT_In)
);
lfsr_counter RT (
.clk(Clk),
.reset(Rst),
.enable(En),
.lfsr_output(RM_In)
);
// assign RT_In=16'h1111;
// assign RM_In=16'h1111;
assign Apwd=32'habcd1234;
assign Kpwd=32'habcd1234;
XOR_PadGen_operation Top (
.Clk(Clk),
.Rst(Rst),
.En(En),
.RT_In(RT_In),
.RM_In(RM_In),
.Apwd(Apwd),
.Kpwd(Kpwd),
.Pad1(Pad1),
.Pad2(Pad2),
.CCPwdM(CCPwdM),
.CCPwdL(CCPwdL)
);
bcd BCD(
.CCPwdM(CCPwdM),
.CCPwdL(CCPwdL),
.SW(SW),
.Seg1(Seg1),
.Seg2(Seg2),
.Seg3(Seg3),
.Seg4(Seg4)
);
endmodule
module XOR_PadGen_operation (Clk,Rst,En,RT_In,RM_In,Apwd,Kpwd,Pad1,Pad2,CCPwdM,CCPwdL);
input Clk,Rst,En;
input [15:0]RT_In,RM_In;
input [31:0]Apwd,Kpwd;
output [15:0]Pad1,Pad2;
output [15:0]CCPwdM,CCPwdL;
wire [15:0]RTM_Reg,RV_Reg,RW_Reg,RVW_Reg;
wire [15:0]RT_Reg,RM_Reg,RTM,RV,RW,RVW;
R_Register M0 (
.Clk(Clk),
.Rst(Rst),
.R(RT_In),
.Out(RT_Reg)
);
R_Register M1 (
.Clk(Clk),
.Rst(Rst),
.R(RM_In),
.Out(RM_Reg)
);
Xor_Gate Rtm (
.In1(RT_Reg),
.In2(RM_Reg),
.Out(RTM)
);
/*
XOR_Register_Rx M2(
.Clk(Clk),
.Rst(Rst),
.R(RTM),
.Out(RTM_Reg)
);
*/
PadGen Pad_Gen_RV(
.clk(Clk),
.in1(RT_Reg),
.in2(RM_Reg),
.pwd(Apwd),
.Padgen_output(RV)
);
/*
R_Register M3 (
.Clk(Clk),
.Rst(Rst),
.R(RV),
.Out(RV_Reg)
);
*/
PadGen Pad_Gen_RW(
.clk(Clk),
.in1(RT_Reg),
.in2(RTM),
.pwd(Apwd),
.Padgen_output(RW)
);
/*
R_Register M4 (
.Clk(Clk),
.Rst(Rst),
.R(RW),
.Out(RW_Reg)
);
*/
Xor_Gate Rvw (
.In1(RV),
.In2(RW),
.Out(RVW)
);
/*
XOR_Register_Rx M5(
.Clk(Clk),
.Rst(Rst),
.R(RVW),
.Out(RVW_Reg)
);
*/
PadGen Pad_Gen_Pad1(
.clk(Clk),
.in1(RV),
.in2(RW),
.pwd(Kpwd),
.Padgen_output(Pad1)
);
PadGen Pad_Gen_Pad2(
.clk(Clk),
.in1(RV),
.in2(RVW),
.pwd(Kpwd),
.Padgen_output(Pad2)
);
Xor_Gate CCPWDM(
.In1(Pad1),
.In2(Apwd[31:16]),
.Out(CCPwdM)
);
Xor_Gate CCPWDL(
.In1(Pad2),
.In2(Apwd[15:0]),
.Out(CCPwdL)
);
endmodule
module Xor_Gate (In1,In2,Out);
input [15:0]In1,In2;
output [15:0]Out;
assign Out=In1^In2;
endmodule
module R_Register(Clk,Rst,R,Out);
input Clk,Rst;
input [15:0]R;
output [15:0]Out;
DFF M0(
.Clk(Clk),
.Rst(Rst),
.D(R[0]),
.Q(Out[0])
);
DFF M1(
.Clk(Clk),
.Rst(Rst),
.D(R[1]),
.Q(Out[1])
);
DFF M2(
.Clk(Clk),
.Rst(Rst),
.D(R[2]),
.Q(Out[2])
);
DFF M3(
.Clk(Clk),
.Rst(Rst),
.D(R[3]),
.Q(Out[3])
);
DFF M4(
.Clk(Clk),
.Rst(Rst),
.D(R[4]),
.Q(Out[4])
);
DFF M5(
.Clk(Clk),
.Rst(Rst),
.D(R[5]),
.Q(Out[5])
);
DFF M6(
.Clk(Clk),
.Rst(Rst),
.D(R[6]),
.Q(Out[6])
);
DFF M7(
.Clk(Clk),
.Rst(Rst),
.D(R[7]),
.Q(Out[7])
);
DFF M8(
.Clk(Clk),
.Rst(Rst),
.D(R[8]),
.Q(Out[8])
);
DFF M9(
.Clk(Clk),
.Rst(Rst),
.D(R[9]),
.Q(Out[9])
);
DFF M10(
.Clk(Clk),
.Rst(Rst),
.D(R[10]),
.Q(Out[10])
);
DFF M11(
.Clk(Clk),
.Rst(Rst),
.D(R[11]),
.Q(Out[11])
);
DFF M12(
.Clk(Clk),
.Rst(Rst),
.D(R[12]),
.Q(Out[12])
);
DFF M13(
.Clk(Clk),
.Rst(Rst),
.D(R[13]),
.Q(Out[13])
);
DFF M14(
.Clk(Clk),
.Rst(Rst),
.D(R[14]),
.Q(Out[14])
);
DFF M15(
.Clk(Clk),
.Rst(Rst),
.D(R[15]),
.Q(Out[15])
);
endmodule
module lfsr_counter(
input clk,
input reset,
input enable,
output reg [15:0]lfsr_output);
reg [15:0] lfsr;
wire d0,lfsr_equal;
xnor(d0,lfsr[15],lfsr[14],lfsr[12],lfsr[3]);
assign lfsr_equal = (lfsr == 16'h8000);
always @(posedge clk,posedge reset) begin
if(reset) begin
lfsr <= 0;
lfsr_output <= 0;
end
else begin
if(enable)
lfsr <= lfsr_equal ? 16'h0 : {lfsr[14:0],d0};
lfsr_output <= lfsr;
end
end
endmodule
module DFF (Clk,Rst,D,Q);
input Clk,Rst;
input D;
output reg Q;
always @ (posedge Clk)
begin
if(Rst)
Q=1'b0;
else
Q=D;
end
endmodule
module bcd(SW,CCPwdM,CCPwdL,Seg1,Seg2,Seg3,Seg4);
input [15:0]CCPwdM,CCPwdL;
input SW;
output reg [6:0]Seg1,Seg2,Seg3,Seg4;
always@(*)begin
if(SW)begin
case(CCPwdM[15:12])
4'h0: Seg1=7'b0000001;
4'h1: Seg1=7'b1001111;
4'h2: Seg1=7'b0010010;
4'h3: Seg1=7'b0000110;
4'h4: Seg1=7'b1001100;
4'h5: Seg1=7'b0100100;
4'h6: Seg1=7'b0100000;
4'h7: Seg1=7'b0001111;
4'h8: Seg1=7'b0000000;
4'h9: Seg1=7'b0000100;
4'ha: Seg1=7'b0001000;
4'hb: Seg1=7'b1100000;
4'hc: Seg1=7'b0110001;
4'hd: Seg1=7'b1000010;
4'he: Seg1=7'b0110000;
4'hf: Seg1=7'b0111000;
endcase
case(CCPwdM[11:8])
4'h0: Seg2=7'b0000001;
4'h1: Seg2=7'b1001111;
4'h2: Seg2=7'b0010010;
4'h3: Seg2=7'b0000110;
4'h4: Seg2=7'b1001100;
4'h5: Seg2=7'b0100100;
4'h6: Seg2=7'b0100000;
4'h7: Seg2=7'b0001111;
4'h8: Seg2=7'b0000000;
4'h9: Seg2=7'b0000100;
4'ha: Seg2=7'b0001000;
4'hb: Seg2=7'b1100000;
4'hc: Seg2=7'b0110001;
4'hd: Seg2=7'b1000010;
4'he: Seg2=7'b0110000;
4'hf: Seg2=7'b0111000;
endcase
case(CCPwdM[7:4])
4'h0: Seg3=7'b0000001;
4'h1: Seg3=7'b1001111;
4'h2: Seg3=7'b0010010;
4'h3: Seg3=7'b0000110;
4'h4: Seg3=7'b1001100;
4'h5: Seg3=7'b0100100;
4'h6: Seg3=7'b0100000;
4'h7: Seg3=7'b0001111;
4'h8: Seg3=7'b0000000;
4'h9: Seg3=7'b0000100;
4'ha: Seg3=7'b0000010;
4'hb: Seg3=7'b0001000;
4'hc: Seg3=7'b0110001;
4'hd: Seg3=7'b1000010;
4'he: Seg3=7'b0110000;
4'hf: Seg3=7'b0111000;
endcase
case(CCPwdM[3:0])
4'h0: Seg4=7'b0000001;
4'h1: Seg4=7'b1001111;
4'h2: Seg4=7'b0010010;
4'h3: Seg4=7'b0000110;
4'h4: Seg4=7'b1001100;
4'h5: Seg4=7'b0100100;
4'h6: Seg4=7'b0100000;
4'h7: Seg4=7'b0001111;
4'h8: Seg4=7'b0000000;
4'h9: Seg4=7'b0000100;
4'ha: Seg4=7'b0001000;
4'hb: Seg4=7'b1100000;
4'hc: Seg4=7'b0110001;
4'hd: Seg4=7'b1000010;
4'he: Seg4=7'b0110000;
4'hf: Seg4=7'b0111000;
endcase
end
else begin
case(CCPwdL[15:12])
4'h0: Seg1=7'b0000001;
4'h1: Seg1=7'b1001111;
4'h2: Seg1=7'b0010010;
4'h3: Seg1=7'b0000110;
4'h4: Seg1=7'b1001100;
4'h5: Seg1=7'b0100100;
4'h6: Seg1=7'b0100000;
4'h7: Seg1=7'b0001111;
4'h8: Seg1=7'b0000000;
4'h9: Seg1=7'b0000100;
4'ha: Seg1=7'b0001000;
4'hb: Seg1=7'b1100000;
4'hc: Seg1=7'b0110001;
4'hd: Seg1=7'b1000010;
4'he: Seg1=7'b0110000;
4'hf: Seg1=7'b0111000;
endcase
case(CCPwdL[11:8])
4'h0: Seg2=7'b0000001;
4'h1: Seg2=7'b1001111;
4'h2: Seg2=7'b0010010;
4'h3: Seg2=7'b0000110;
4'h4: Seg2=7'b1001100;
4'h5: Seg2=7'b0100100;
4'h6: Seg2=7'b0100000;
4'h7: Seg2=7'b0001111;
4'h8: Seg2=7'b0000000;
4'h9: Seg2=7'b0000100;
4'ha: Seg2=7'b0001000;
4'hb: Seg2=7'b1100000;
4'hc: Seg2=7'b0110001;
4'hd: Seg2=7'b1000010;
4'he: Seg2=7'b0110000;
4'hf: Seg2=7'b0111000;
endcase
case(CCPwdL[7:4])
4'h0: Seg3=7'b0000001;
4'h1: Seg3=7'b1001111;
4'h2: Seg3=7'b0010010;
4'h3: Seg3=7'b0000110;
4'h4: Seg3=7'b1001100;
4'h5: Seg3=7'b0100100;
4'h6: Seg3=7'b0100000;
4'h7: Seg3=7'b0001111;
4'h8: Seg3=7'b0000000;
4'h9: Seg3=7'b0000100;
4'ha: Seg3=7'b0001000;
4'hb: Seg3=7'b1100000;
4'hc: Seg3=7'b0110001;
4'hd: Seg3=7'b1000010;
4'he: Seg3=7'b0110000;
4'hf: Seg3=7'b0111000;
endcase
case(CCPwdL[3:0])
4'h0: Seg4=7'b0000001;
4'h1: Seg4=7'b1001111;
4'h2: Seg4=7'b0010010;
4'h3: Seg4=7'b0000110;
4'h4: Seg4=7'b1001100;
4'h5: Seg4=7'b0100100;
4'h6: Seg4=7'b0100000;
4'h7: Seg4=7'b0001111;
4'h8: Seg4=7'b0000000;
4'h9: Seg4=7'b0000100;
4'ha: Seg4=7'b0000010;
4'hb: Seg4=7'b0001000;
4'hc: Seg4=7'b0110001;
4'hd: Seg4=7'b1000010;
4'he: Seg4=7'b0110000;
4'hf: Seg4=7'b0111000;
endcase
end
end
endmodule