Visible to Intel only — GUID: mwh1409958542668
Ixiasoft
Visible to Intel only — GUID: mwh1409958542668
Ixiasoft
1.5. Freeze Logic for PR Regions
When you instantiate the Altera PR IP core in your design, the IP incudes a freeze port which you can use to freeze the non-global inputs of the PR region. In case your design has multiple PR regions, you must create decoding logic to freeze only the inputs of the PR region being partially reconfigured.
If you are not using the Altera PR IP, you must include logic to freeze the inputs of the PR regions in the design as required for proper operation.
Freezing all non-global inputs for the PR region ensures there is no contention between current values that may result in unexpected behavior of the design after partial reconfiguration is complete. Global signals going into the PR region should not be frozen to high. The Intel® Quartus® Prime software freezes the outputs from the PR region; therefore the logic outside of the PR region is not affected.
During partial reconfiguration, the static region logic should not depend on the outputs from PR regions to be at a specific logic level for the continued operation of the static region.
The easiest way to control the inputs to PR regions is by creating a wrapper around the PR region in RTL. In addition to freezing all inputs high, you can also drive the outputs from the PR block to a specific value, if required by your design. For example, if the output drives a signal that is active high, then your wrapper could freeze the output to GND. The idea is to make sure the static region will not stall or go to indeterminate state, when the PR region is getting a new persona through PR.
The following example implements a freeze wrapper in Verilog HDL, on a module named pr_module.
module freeze_wrapper ( input reset, // global reset signal input freeze, // PR process active, generated by user logic input clk1, // global clock signal input clk2, // non-global clock signal input [3:0] control_mode, input [3:0] framer_ctl, output [15:0] data_out ); wire [3:0]control_mode_wr, framer_ctl_wr; wire clk2_to_wr; //instantiate pr_module pr_module pr_module ( .reset (reset), //input .clk1 (clk1), //input, global clock .clk2 (clk2_to_wr), // input, non-global clock .control_mode (control_mode_wr), //input .framer_ctl (framer_ctl_wr), //input .pr_module_out (data_out) // collection of outputs from pr_module ); // Freeze all inputs assign control_mode_wr = freeze ? 4'hF: control_mode; assign framer_ctl_wr = freeze ? 4'hF: framer_ctl; assign clk2_to_wr = freeze ? 1'b1 : clk2; endmodule
The following example implements a freeze wrapper in VHDL, on a module named pr_module.
entity freeze_wrapper is port( reset:in STD_LOGIC; -- global reset signal freeze:in STD_LOGIC; clk1: in STD_LOGIC; -- global signal clk2: in STD_LOGIC; -- non-global signal control_mode: in STD_LOGIC_VECTOR (3 downto 0); framer_ctl: in STD_LOGIC_VECTOR (3 downto 0); data_out: out STD_LOGIC_VECTOR (15 downto 0) ); end freeze_wrapper; architecture behv of freeze_wrapper is component pr_module port( reset:in STD_LOGIC; clk1:in STD_LOGIC; clk2:in STD_LOGIC; control_mode:in STD_LOGIC_VECTOR (3 downto 0); framer_ctl:in STD_LOGIC_VECTOR (3 downto 0); pr_module_out:out STD_LOGIC_VECTOR (15 downto 0) ); end component signal control_mode_wr: in STD_LOGIC_VECTOR (3 downto 0); signal framer_ctl_wr : in STD_LOGIC_VECTOR (3 downto 0); signal clk2_to_wr : STD_LOGIC; signal data_out_temp : STD_LOGIC_VECTOR (15 downto 0); signal logic_high : STD_LOGIC_VECTOR (3 downto 0):="1111"; begin data_out(15 downto 0) <= data_out_temp(15 downto 0); m_pr_module: pr_module port map ( reset => reset, clk1 => clk1, clk2 => clk2_to_wr, control_mode =>control_mode_wr, framer_ctl => framer_ctl_wr, pr_module_out => data_out_temp); -- freeze all inputs control_mode_wr <= logic_high when (freeze ='1') else control_mode; framer_ctl_wr <= logic_high when (freeze ='1') else framer_ctl; clk2_to_wr <= logic_high(0) when (freeze ='1') else clk2; end architecture;