Intel® Quartus® Prime Pro Edition用户指南: 部分重配置

ID 683834
日期 5/11/2020
Public
文档目录

1.9.1.1. 仿真PR角色替换

当在部分重配置过程中加载新角色时,PR分区的逻辑操作会更改。在使用多路复用器在仿真的角色的输入和输出上仿真角色的替换。创建RTL wrapper逻辑以代表角色的顶层。wrapper在编译期间例化默认角色。在仿真过程中,wrapper支持将活动角色替换为另一个角色。在 Intel® Quartus® Prime EDA Netlist Writer创建的PR仿真模型中将每个角色例化为行为RTL。 Intel® Quartus® Prime软件包括仿真模块,可与仿真测试台连接:
  • altera_pr_wrapper_mux_in
  • altera_pr_wrapper_mux_out
  • altera_pr_persona_if (SystemVerilog实例使您能够将wrapper multiplexer连接到testbench driver)
图 32. PR角色切换的仿真

PR角色切换仿真的RTL Wrapper

altera_pr_wrapper_mux_out模块的pr_activate输入使MUX输出X。此功能允许PR角色的未知输出的仿真,还验证设计冻结逻辑的正常运行。以下代码对应于PR角色切换的仿真,如上图所示:

module pr_core_wrapper
(
   input wire a,
   input wire b,
   output wire o
);

localparam ENABLE_PERSONA_1 = 1;
localparam ENABLE_PERSONA_2 = 1;
localparam ENABLE_PERSONA_3 = 1;
localparam NUM_PERSONA = 3;

logic pr_activate;
int persona_select;

altera_pr_persona_if persona_bfm();
assign pr_activate = persona_bfm.pr_activate;
assign persona_select = persona_bfm.persona_select;


wire a_mux [NUM_PERSONA-1:0];
wire b_mux [NUM_PERSONA-1:0];
wire o_mux [NUM_PERSONA-1:0];

generate
   if (ENABLE_PERSONA_1) begin
      localparam persona_id = 0;

      `ifdef ALTERA_ENABLE_PR_MODEL
         assign u_persona_0.altera_sim_pr_activate = pr_activate;
      `endif

      pr_and u_persona_0
      (
         .a(a_mux[persona_id]),
         .b(b_mux[persona_id]),
         .o(o_mux[persona_id])
      );
   end
endgenerate

generate
   if (ENABLE_PERSONA_2) begin
      localparam persona_id = 1;

      `ifdef ALTERA_ENABLE_PR_MODEL
         assign u_persona_1.altera_sim_pr_activate = pr_activate;
      `endif

      pr_or u_persona_1
      (
         .a(a_mux[persona_id]),
         .b(b_mux[persona_id]),
         .o(o_mux[persona_id])
      );

   end
endgenerate

generate
   if (ENABLE_PERSONA_3) begin
      localparam persona_id = 2;

      `ifdef ALTERA ENABLE PR MODEL
         assign u_persona_2.altera_sim_pr_activate = pr_activate;
      `endif

      pr_empty u_persona_2
      (
         .a(a_mux[persona_id]),
         .b(b_mux[persona_id]),
         .o(o_mux[persona_id])
      );

   end
endgenerate


altera_pr_wrapper_mux_in #(.NUM_PERSONA(NUM_PERSONA), .WIDTH(1)) \
     u_a_mux(.sel(persona_select), .mux_in(a), .mux_out(a_mux));

altera_pr_wrapper_mux_in #(.NUM_PERSONA(NUM_PERSONA), .WIDTH(1)) \
     u_b_mux(.sel(persona_select), .mux_in(b), .mux_out(b_mux));

altera_pr_wrapper_mux_out #(.NUM_PERSONA(NUM_PERSONA), .WIDTH(1)) \
     u_o_mux(.sel(persona_select), .mux_in(o_mux), .mux_out(o), .pr_activate \
     (pr_activate));

endmodule