m0_66862303 2024-11-25 10:35 采纳率: 0%
浏览 92
已结题

对这段代码用Astro进行layout,用redhawk进行ir drop 的测试和分析,以及降低ir drop 的方法和实现

【有偿追加,求专家解答!】对这段代码用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

  • 写回答

27条回答 默认 最新

  • M_try的小尾巴 2024-11-26 11:57
    关注

    提示: 本回答参考 AIGC,由本人审核整理提供。若问题解决,望采纳;如仍有疑问,请评论回复。

    问题分析与解答

    1. 使用Astro进行Layout

    步骤:

    1. 导入设计:将Verilog代码导入到Astro中。确保所有模块和端口都正确导入。
    2. 设置约束:根据设计需求设置时序和物理约束。这包括时钟频率、输入输出延迟、布局布线规则等。
    3. 布局:进行自动布局,确保所有模块和端口的位置合理,减少布线长度和信号延迟。
    4. 布线:进行自动布线,确保所有信号路径最短且符合设计规则。
    5. 验证:检查布局布线结果,确保没有违反设计规则和时序要求。

    2. 使用Redhawk进行IR Drop测试和分析

    步骤:

    1. 导入布局结果:将Astro生成的布局结果导入到Redhawk中。
    2. 设置电源网络:定义电源网络(VDD和VSS),并分配电源平面和电源轨。
    3. 运行IR Drop分析:运行IR Drop分析工具,计算电源网络中的电压降。
    4. 查看结果:分析IR Drop结果,识别高IR Drop区域和潜在问题点。

    3. 降低IR Drop的方法和实现

    方法:

    1. 增加电源轨宽度:通过增加电源轨的宽度来降低电阻,从而减少IR Drop。
    2. 优化电源平面:通过优化电源平面的布局,减少电源路径的长度,从而降低IR Drop。
    3. 使用多层电源平面:通过使用多层电源平面,增加电源路径的并行性,从而降低IR Drop。
    4. 增加去耦电容:在关键区域增加去耦电容,提供局部电源,减少IR Drop。
    5. 优化布局:通过优化布局,减少电源路径的长度和复杂性,从而降低IR Drop。

    实现:

    1. 修改布局:在Astro中修改布局,增加电源轨宽度和优化电源平面。
    2. 重新布线:在Redhawk中重新布线,确保新的电源路径符合设计规则。
    3. 重新运行IR Drop分析:在Redhawk中重新运行IR Drop分析,验证IR Drop是否降低。

    代码分析

    主要模块功能

    1. TopModule_Xor_RanGen:顶层模块,包含时钟、复位、使能信号,以及随机数生成器和XOR操作。
    2. XOR_PadGen_operation:执行XOR操作和Pad生成。
    3. lfsr_counter:线性反馈移位寄存器(LFSR)计数器,用于生成随机数。
    4. R_Register:寄存器模块,用于存储数据。
    5. Xor_Gate:XOR门模块,执行异或操作。
    6. bcd:BCD编码模块,将输入数据转换为7段显示码。

    代码优化建议

    1. 减少硬编码:避免在代码中硬编码常量值,如assign Apwd = 32'habcd1234;,建议使用参数化设计。
    2. 模块复用:将重复使用的模块(如R_Register)进行模块化设计,减少代码冗余。
    3. 时序优化:在关键路径上增加寄存器,减少时序延迟。

    总结

    通过使用Astro进行布局和Redhawk进行IR Drop分析,可以有效优化硬件设计,降低IR Drop。同时,代码的优化和模块化设计可以提高设计的可维护性和可扩展性。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月27日
  • 修改了问题 11月25日
  • 修改了问题 11月25日
  • 赞助了问题酬金50元 11月25日
  • 展开全部