mercury_atoms.vhd

来自「一个非常好的dc使用书籍 一个非常好的dc使用书籍」· VHDL 代码 · 共 1,341 行 · 第 1/5 页

VHD
1,341
字号
   VitalWireDelay (datad_ipd, datad, tipd_datad);
   VitalWireDelay (cin_ipd, cin, tipd_cin);
   VitalWireDelay (cin0_ipd, cin0, tipd_cin);
   VitalWireDelay (cin1_ipd, cin1, tipd_cin);
   VitalWireDelay (multsela_ipd, multsela, tipd_multsela);
   VitalWireDelay (multselb_ipd, multselb, tipd_multselb);
   VitalWireDelay (multdataa_ipd, multdataa, tipd_multdataa);
   VitalWireDelay (multdatab_ipd, multdatab, tipd_multdatab);
   end block;

VITALtiming : process(dataa_ipd, datab_ipd, datac_ipd, datad_ipd, cin_ipd, cin0_ipd, cin1_ipd, multsela_ipd, multselb_ipd, multdataa_ipd, multdatab_ipd)

variable combout_VitalGlitchData : VitalGlitchDataType;
variable multout_VitalGlitchData : VitalGlitchDataType;
variable cout_VitalGlitchData : VitalGlitchDataType;
variable cout0_VitalGlitchData : VitalGlitchDataType;
variable cout1_VitalGlitchData : VitalGlitchDataType;
variable regin_VitalGlitchData : VitalGlitchDataType;

variable icomb, icout, icout0, icout1, ilutout: std_logic;
variable idata, setbit : std_logic := '0';
variable tmp_combout, tmp_cout, tmp_cout0, tmp_cout1, tmp_regin, tmp_multout : std_logic;
variable lut_mask_std : std_logic_vector (15 downto 0) :=  str_to_bin(lut_mask); 

begin


	if operation_mode = "normal" then
		if cin_used = "true" then
			if ((cin0_used = "true") or (cin1_used = "true")) then
				if (cin_ipd = '0') then
					icomb := VitalMUX(data => lut_mask_std,
                		  dselect => (datad_ipd, cin0_ipd, datab_ipd, dataa_ipd)); 
				else
					icomb := VitalMUX(data => lut_mask_std,
                		  dselect => (datad_ipd, cin1_ipd, datab_ipd, dataa_ipd)); 
				end if;
			else
				icomb := VitalMUX(data => lut_mask_std,
                		  dselect => (datad_ipd, cin_ipd, datab_ipd, dataa_ipd)); 
			end if;
		elsif (cin0_used = "true") then
				icomb := VitalMUX(data => lut_mask_std,
                		  dselect => (datad_ipd, cin0_ipd, datab_ipd, dataa_ipd)); 
		else
			icomb := VitalMUX(data => lut_mask_std,
                		  dselect => (datad_ipd, datac_ipd, datab_ipd, dataa_ipd)); 
		end if;
	end if;


	if operation_mode = "arithmetic" then
		icout0 := VitalMUX(data => lut_mask_std,
    				   dselect => ('0', cin0_ipd, datab_ipd, dataa_ipd));
		icout1 := VitalMUX(data => lut_mask_std,
     				   dselect => ('0', cin1_ipd, datab_ipd, dataa_ipd));

		if cin_used = "true" then
			if ((cin0_used = "true") or (cin1_used = "true")) then
				if (cin_ipd = '0') then
					icomb := VitalMUX(data => lut_mask_std,
                		  dselect => ('1', cin0_ipd, datab_ipd, dataa_ipd)); 
					icout := icout0;
				else
					icomb := VitalMUX(data => lut_mask_std,
                		  dselect => ('1', cin1_ipd, datab_ipd, dataa_ipd)); 
					icout := icout1;
				end if;
			else
				icomb := VitalMUX(data => lut_mask_std,
                		  dselect => ('1', cin_ipd, datab_ipd, dataa_ipd)); 
				icout := VitalMUX(data => lut_mask_std,
      				   dselect => ('0', cin_ipd, datab_ipd, dataa_ipd));
			end if;
		elsif (cin0_used = "true") then
				icomb := VitalMUX(data => lut_mask_std,
                		  dselect => ('1', cin0_ipd, datab_ipd, dataa_ipd)); 
				icout := VitalMUX(data => lut_mask_std,
      				   dselect => ('0', cin0_ipd, datab_ipd, dataa_ipd));
		else
			icomb := VitalMUX(data => lut_mask_std,
                		  dselect => ('1', datac_ipd, datab_ipd, dataa_ipd)); 
			icout := VitalMUX(data => lut_mask_std,
      				   dselect => ('0', datac_ipd, datab_ipd, dataa_ipd));
		end if;

	end if;

	if operation_mode = "multiplier" then
		icout0 := VitalMUX(data => lut_mask_std,
      				   dselect => ('0', cin0_ipd, datab_ipd, dataa_ipd));
		icout1 := VitalMUX(data => lut_mask_std,
      				   dselect => ('0', cin1_ipd, datab_ipd, dataa_ipd));
		if (cin_ipd = '0') then
			ilutout := VitalMUX(data => lut_mask_std,
      	             dselect => ('1', cin0_ipd, datab_ipd, dataa_ipd));
			icout := icout0;
		else
			ilutout := VitalMUX(data => lut_mask_std,
                      dselect => ('1', cin1_ipd, datab_ipd, dataa_ipd));
			icout := icout1;
		end if;

		if (multsela_ipd = '0') then
			if (multselb_ipd = '0') then
				if (multiplier_mux_source = "vcc") then
					icomb := '1';
				else
					icomb := '0';
				end if;
			else
				icomb := multdatab_ipd;
			end if;
		else
			if (multselb_ipd = '0') then
				icomb := multdataa_ipd;
			else
				icomb := ilutout;
			end if;
		end if;
	end if;

	tmp_combout := icomb;
	tmp_cout := icout;
	tmp_cout0 := icout0;
	tmp_cout1 := icout1;
   tmp_regin := icomb;
	tmp_multout := icomb;

      ----------------------
      --  Path Delay Section
      ----------------------

      VitalPathDelay01 (
       OutSignal => combout,
       OutSignalName => "COMBOUT",
       OutTemp => tmp_combout,
       Paths => (0 => (dataa_ipd'last_event, tpd_dataa_combout, (operation_mode /= "multiplier" OR (multsela_ipd = '0' AND multselb_ipd = '0') OR (multsela_ipd = '1' AND multselb_ipd = '1'))),
                 1 => (datab_ipd'last_event, tpd_datab_combout, (operation_mode /= "multiplier" OR (multsela_ipd = '0' AND multselb_ipd = '0') OR (multsela_ipd = '1' AND multselb_ipd = '1'))),
                 2 => (datac_ipd'last_event, tpd_datac_combout, TRUE),
                 3 => (datad_ipd'last_event, tpd_datad_combout, TRUE),
                 4 => (cin_ipd'last_event, tpd_cin_combout, TRUE),
                 5 => (cin0_ipd'last_event, tpd_cin0_combout, TRUE),
                 6 => (cin1_ipd'last_event, tpd_cin1_combout, TRUE),
                 7 => (multsela_ipd'last_event, tpd_multsela_combout, TRUE),
                 8 => (multselb_ipd'last_event, tpd_multselb_combout, TRUE),
                 9 => (multdataa_ipd'last_event, tpd_multdataa_combout, (operation_mode= "multiplier" and multsela_ipd = '1' and multselb_ipd = '0')),
                 10 => (multdatab_ipd'last_event, tpd_multdatab_combout, (operation_mode= "multiplier" and multsela_ipd = '0' and multselb_ipd = '1'))),
       GlitchData => combout_VitalGlitchData,
       Mode => DefGlitchMode,
       XOn  => XOn,
       MsgOn => MsgOn );

      VitalPathDelay01 (
       OutSignal => regin,
       OutSignalName => "REGIN",
       OutTemp => tmp_regin,
       Paths => (0 => (dataa_ipd'last_event, tpd_dataa_regin, (operation_mode /= "multiplier" OR (multsela_ipd = '0' AND multselb_ipd = '0') OR (multsela_ipd = '1' AND multselb_ipd = '1'))),
                 1 => (datab_ipd'last_event, tpd_datab_regin, (operation_mode /= "multiplier" OR (multsela_ipd = '0' AND multselb_ipd = '0') OR (multsela_ipd = '1' AND multselb_ipd = '1'))),
                 2 => (datac_ipd'last_event, tpd_datac_regin, TRUE),
                 3 => (datad_ipd'last_event, tpd_datad_regin, TRUE),
                 4 => (cin_ipd'last_event, tpd_cin_regin, TRUE),
                 5 => (cin0_ipd'last_event, tpd_cin0_regin, TRUE),
                 6 => (cin1_ipd'last_event, tpd_cin1_regin, TRUE),
                 7 => (multsela_ipd'last_event, tpd_multsela_regin, TRUE),
                 8 => (multselb_ipd'last_event, tpd_multselb_regin, TRUE),
                 9 => (multdataa_ipd'last_event, tpd_multdataa_regin, (operation_mode= "multiplier" and multsela_ipd = '1' and multselb_ipd = '0')),
                 10 => (multdatab_ipd'last_event, tpd_multdatab_regin, (operation_mode= "multiplier" and multsela_ipd = '0' and multselb_ipd = '1'))),
       GlitchData => regin_VitalGlitchData,
       Mode => DefGlitchMode,
       XOn  => XOn,
       MsgOn => MsgOn );

      VitalPathDelay01 ( 
       OutSignal => cout, 
       OutSignalName => "COUT",
       OutTemp => tmp_cout,
       Paths => (0 => (dataa_ipd'last_event, tpd_dataa_cout, TRUE),
                 1 => (datab_ipd'last_event, tpd_datab_cout, TRUE),
                 2 => (datac_ipd'last_event, tpd_datac_cout, TRUE),
                 3 => (datad_ipd'last_event, tpd_datad_cout, TRUE),
                 4 => (cin_ipd'last_event, tpd_cin_cout, TRUE),
                 5 => (cin0_ipd'last_event, tpd_cin0_cout, TRUE),
                 6 => (cin1_ipd'last_event, tpd_cin1_cout, TRUE)),
       GlitchData => cout_VitalGlitchData,    
       Mode => DefGlitchMode, 
       XOn  => XOn, 
       MsgOn => MsgOn );

      VitalPathDelay01 ( 
       OutSignal => cout0, 
       OutSignalName => "COUT0",
       OutTemp => tmp_cout0,
       Paths => (0 => (dataa_ipd'last_event, tpd_dataa_cout0, TRUE),
                 1 => (datab_ipd'last_event, tpd_datab_cout0, TRUE),
                 2 => (cin0_ipd'last_event, tpd_cin0_cout0, TRUE)),
       GlitchData => cout0_VitalGlitchData,    
       Mode => DefGlitchMode, 
       XOn  => XOn, 
       MsgOn => MsgOn );

      VitalPathDelay01 ( 
       OutSignal => cout1, 
       OutSignalName => "COUT1",
       OutTemp => tmp_cout1,
       Paths => (0 => (dataa_ipd'last_event, tpd_dataa_cout1, TRUE),
                 1 => (datab_ipd'last_event, tpd_datab_cout1, TRUE),
                 2 => (cin1_ipd'last_event, tpd_cin1_cout1, TRUE)),
       GlitchData => cout1_VitalGlitchData,    
       Mode => DefGlitchMode, 
       XOn  => XOn, 
       MsgOn => MsgOn );

      VitalPathDelay01 (
       OutSignal => multout,
       OutSignalName => "MULTOUT",
       OutTemp => tmp_multout,
       Paths => (0 => (dataa_ipd'last_event, tpd_dataa_multout, TRUE),
                 1 => (datab_ipd'last_event, tpd_datab_multout, TRUE),
                 2 => (multsela_ipd'last_event, tpd_multsela_multout, TRUE),
                 3 => (multselb_ipd'last_event, tpd_multselb_multout, TRUE),
                 4 => (cin_ipd'last_event, tpd_cin_multout, TRUE),
                 5 => (cin0_ipd'last_event, tpd_cin0_multout, TRUE),
                 6 => (cin1_ipd'last_event, tpd_cin1_multout, TRUE),
				 7 => (multdataa_ipd'last_event, tpd_multdataa_multout, (operation_mode= "multiplier" and multsela_ipd = '1' and multselb_ipd = '0')),
                 8 => (multdatab_ipd'last_event, tpd_multdatab_multout, (operation_mode= "multiplier" and multsela_ipd = '0' and multselb_ipd = '1'))),
       GlitchData => multout_VitalGlitchData,
       Mode => DefGlitchMode,
       XOn  => XOn,
       MsgOn => MsgOn );

end process;

end vital_le;	

LIBRARY IEEE, mercury;
USE IEEE.std_logic_1164.all;
USE IEEE.VITAL_Timing.all;
USE IEEE.VITAL_Primitives.all;
USE mercury.atom_pack.all;

ENTITY mercury_lcell_register is
  GENERIC (
      power_up : string := "low";
      packed_mode   : string := "false";
      TimingChecksOn: Boolean := True;
      MsgOn: Boolean := DefGlitchMsgOn;
      XOn: Boolean := DefGlitchXOn;
      MsgOnChecks: Boolean := DefMsgOnChecks;
      XOnChecks: Boolean := DefXOnChecks;
      InstancePath: STRING := "*";
      tsetup_datain_clk_noedge_posedge	: VitalDelayType := DefSetupHoldCnst;
      tsetup_datac_clk_noedge_posedge	: VitalDelayType := DefSetupHoldCnst;
      tsetup_sclr_clk_noedge_posedge	: VitalDelayType := DefSetupHoldCnst;
      tsetup_sload_clk_noedge_posedge	: VitalDelayType := DefSetupHoldCnst;
      tsetup_ena_clk_noedge_posedge	: VitalDelayType := DefSetupHoldCnst;
      thold_datain_clk_noedge_posedge	: VitalDelayType := DefSetupHoldCnst;
      thold_datac_clk_noedge_posedge	: VitalDelayType := DefSetupHoldCnst;
      thold_sclr_clk_noedge_posedge	: VitalDelayType := DefSetupHoldCnst;
      thold_sload_clk_noedge_posedge	: VitalDelayType := DefSetupHoldCnst;
      thold_ena_clk_noedge_posedge	: VitalDelayType := DefSetupHoldCnst;
      tpd_clk_regout_posedge		: VitalDelayType01 := DefPropDelay01;
      tpd_apre_regout_posedge		: VitalDelayType01 := DefPropDelay01;
      tpd_aclr_regout_posedge		: VitalDelayType01 := DefPropDelay01;
      tpd_aload_regout_posedge		: VitalDelayType01 := DefPropDelay01;
      tpd_datac_regout			: VitalDelayType01 := DefPropDelay01;
      tperiod_clk_posedge               : VitalDelayType := DefPulseWdthCnst;
      tipd_datac  			: VitalDelayType01 := DefPropDelay01; 
      tipd_ena  			: VitalDelayType01 := DefPropDelay01; 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?