I too have spent too many hours lately fussing with Xilinx DCM / PLL clocking. I always use the Core Generator to get the HDL file created quickly, then modify it if necessary. What I notice about the code you have below is, you don't have any of the "attributes" that the Core Generator produces.
I believe those attributes auto-generate the constraints, and if you don't have the attributes, you need to add the constraints manually. I don't think the tools look at that actual inputs to the primitive to determine the timing constraints for the design.
I have not tested this, however I was in a situation the other night where ISE was blowing an error that my clock period of 24.444ns did not meet the actual period of 24.4444444ns. It was very frustrating. The 24.444 was the "CLKIN_PERIOD" of the primitive (and put there by the Core Generator), but the 24.4444444 was a *calculated* value that was part of timing constraints that were auto-generated during synthesis and used in the mapping or place-and-route.
Even if I changed the 24.444 to 24.4444444 in the primitive, it still bitched about a mis-match (the calculated value being compared is certainly held internally in a float or double, and the text converted to a value would never match exactly). I even tried manually adding the correct period as a timing constraints in my UCF file, but ISE then warned me that my manual constraints were being ignored due to the auto-generated constraints that were defined during synthesis.
The only thing I could come up with was that those "attributes" were the cause of the auto-constraints, but I did not bother to test that. I commented out the "CLKIN_PERIOD" parameter, the warning went away, and the timing analysis had the correct values. I think you need to add the attributes.
Here is the section of my PLL primitive I was fighting with. Note, I broke the attributes line for posting in the forum. In the HDL file, it is one long line.
architecture xilinx of clk_21m48 is
attribute CORE_GENERATION_INFO : string;
attribute CORE_GENERATION_INFO of xilinx : architecture is "clk_21m48,clk_wiz_v3_6,
{component_name=clk_21m48,use_phase_alignment=true,use_min_o_jitter=false,
use_max_i_jitter=false,use_dyn_phase_shift=false,use_inclk_switchover=false,
use_dyn_reconfig=false,feedback_source=FDBK_AUTO,primtype_sel=DCM_SP,
num_out_clk=1,clkin1_period=24.444,clkin2_period=24.444,use_power_down=false,
use_reset=false,use_locked=false,use_inclk_stopped=false,use_status=false,
use_freeze=false,use_clk_valid=false,feedback_type=SINGLE,clock_mgr_type=AUTO,
manual_override=false}";
-- Input clock buffering / unused connectors
signal clkin1 : std_logic;
-- Output clock buffering
signal clkfb : std_logic;
signal clk0 : std_logic;
signal clkfx : std_logic;
signal clkfbout : std_logic;
signal locked_internal : std_logic;
signal status_internal : std_logic_vector(7 downto 0);
begin
-- Input buffering
--------------------------------------
clkin1 <= clk_40m909_i;
-- Clocking primitive
--------------------------------------
-- Instantiation of the DCM primitive
-- * Unused inputs are tied off
-- * Unused outputs are labeled unused
dcm_sp_inst: DCM_SP
generic map
(CLKDV_DIVIDE => 2.000,
CLKFX_DIVIDE => 20,
CLKFX_MULTIPLY => 21,
CLKIN_DIVIDE_BY_2 => TRUE,
-- Having this defined causes a warning due to a synthesizer rounding error
-- since it *calculates* the period and generates constraints that cannot be
-- overridden by a user constraint in the UCF file. Stupid.
--CLKIN_PERIOD => 24.444,
CLKOUT_PHASE_SHIFT => "NONE",
CLK_FEEDBACK => "1X",
DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS",
PHASE_SHIFT => 0,
STARTUP_WAIT => FALSE)
port map
-- Input clock