仅对英特尔可见 — GUID: mwh1409958542668
Ixiasoft
1.5. PR区域的冻结逻辑(Freeze Logic)
使用部分重配置时,必须冻结PR区域的所有非全局输入,全局时钟除外。 本地路由的信号不被视为全局信号,也必须在部分重配置期间冻结。冻结(Freezing)是指在那些PR区域输入上驱动一个'1'。当开始一个部分重配置进程时,芯片处于用户模式,器件仍在运行。
在设计中例化Altera PR IP core时,IP包括一个冻结端口,您可以使用此端口冻结PR区域的非全局输入。如果您的设计中有多个PR区域,那么必须创建解码逻辑,只冻结正在进行部分重配置的PR区域的输入。
如果没有使用Altera PR IP,那么必须包含逻辑,以便按照正确操作的要求冻结设计中PR区域的输入。
冻结PR区域的所有非全局输入可确保当前值之间不会存在争用,争用的存在可能会导致部分重配置完成后设计的意外行为。进入PR区域的全局信号不应冻结成高电平。 Intel® Quartus® Prime软件冻结PR区域的输出;因此PR区域之外的逻辑不受影响。
图 9. PR区域边界上的冻结
在部分重配置期间,静态区域逻辑不应该依赖于PR区域的输出处于特定逻辑电平,以实现静态区域的继续操作。
控制PR区域的输入的最简单方法是在RTL中创建PR区域的wrapper。除了将所有输入冻结为高电平外,如果设计需要,那么也可以将PR模块的输出驱动到一个特定值。例如,如果输出驱动一个高电平有效(active high)的信号,那么wrapper可能将输出冻结到GND。当PR区域通过PR获得新的角色时,确保静态区域不会停滞或进入不确定状态。
以下示例在Verilog HDL中实现一个freeze wrapper (在名为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
以下示例在VHDL中实现一个freeze wrapper (在名为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;