160 lines
6.9 KiB
Verilog
Executable File
160 lines
6.9 KiB
Verilog
Executable File
`timescale 1 ps / 1 ps
|
|
|
|
|
|
module ODELAYE2_model (
|
|
output reg DATAOUT,
|
|
input wire C,
|
|
input wire[4:0] CNTVALUEIN,
|
|
input wire LD,
|
|
input wire ODATAIN,
|
|
|
|
// NOT MODELLED
|
|
output wire[4:0] CNTVALUEOUT,
|
|
input wire CE,
|
|
input wire CINVCTRL,
|
|
input wire CLKIN,
|
|
input wire INC,
|
|
input wire LDPIPEEN,
|
|
input wire REGRST
|
|
);
|
|
|
|
parameter CINVCTRL_SEL = "FALSE";
|
|
parameter DELAY_SRC = "ODATAIN";
|
|
parameter HIGH_PERFORMANCE_MODE = "FALSE";
|
|
parameter [0:0] IS_C_INVERTED = 1'b0;
|
|
parameter [0:0] IS_ODATAIN_INVERTED = 1'b0;
|
|
parameter ODELAY_TYPE = "FIXED";
|
|
parameter integer ODELAY_VALUE = 0;
|
|
parameter PIPE_SEL = "FALSE";
|
|
parameter real REFCLK_FREQUENCY = 200.0;
|
|
parameter SIGNAL_PATTERN = "DATA";
|
|
`ifdef NO_TEST_MODEL
|
|
parameter TEST_MODEL = 0;
|
|
`else
|
|
parameter TEST_MODEL = 1;
|
|
`endif
|
|
|
|
// stop simulation if this modelfile does not support the settings
|
|
initial begin
|
|
if(DELAY_SRC != "ODATAIN") begin
|
|
$display("DELAY_SRC must be ODATAIN!");
|
|
$stop;
|
|
end
|
|
if(ODELAY_TYPE != "VAR_LOAD" && ODELAY_TYPE != "FIXED") begin
|
|
$display("ODELAY_TYPE must be VAR_LOAD or FIXED!");
|
|
$stop;
|
|
end
|
|
if(REFCLK_FREQUENCY != 200) begin
|
|
$display("REFCLK_FREQUENCY must be 200!");
|
|
$stop;
|
|
end
|
|
end
|
|
|
|
integer delay_value;
|
|
always @(ODATAIN) DATAOUT <= #(delay_value) ODATAIN;
|
|
generate
|
|
//---------------------------------------------------------------------------------------//
|
|
//----------------------------------- ODELAY_TYPE = VAR_LOAD ----------------------------//
|
|
//---------------------------------------------------------------------------------------//
|
|
if(ODELAY_TYPE == "VAR_LOAD") begin
|
|
initial delay_value = 600;
|
|
always @(posedge C) begin
|
|
if(LD) begin
|
|
delay_value <= 600 + 78*CNTVALUEIN;
|
|
end
|
|
end
|
|
|
|
if(TEST_MODEL == 1) begin
|
|
wire DATAOUT_test;
|
|
reg unequal = 0;
|
|
|
|
ODELAYE2 #(
|
|
.DELAY_SRC("ODATAIN"), // Delay input (ODATAIN, CLKIN)
|
|
.HIGH_PERFORMANCE_MODE("TRUE"), // Reduced jitter to 5ps ("TRUE"), Reduced power but high jitter 9ns ("FALSE")
|
|
.ODELAY_TYPE("VAR_LOAD"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
|
|
.ODELAY_VALUE(0), // Output delay tap setting (0-31)
|
|
.REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0).
|
|
.SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal
|
|
)
|
|
ODELAYE2_test_model_var_load (
|
|
.CNTVALUEOUT(), // 5-bit output: Counter value output
|
|
.DATAOUT(DATAOUT_test), // 1-bit output: Delayed data/clock output
|
|
.C(C), // 1-bit input: Clock input, when using OSERDESE2, C is connected to CLKDIV
|
|
.CE(1'b0), // 1-bit input: Active high enable increment/decrement input
|
|
.CINVCTRL(1'b0), // 1-bit input: Dynamic clock inversion input
|
|
.CLKIN(1'b0), // 1-bit input: Clock delay input
|
|
.CNTVALUEIN(CNTVALUEIN), // 5-bit input: Counter value input
|
|
.INC(1'b0), // 1-bit input: Increment / Decrement tap delay input
|
|
.LD(LD), // 1-bit input: Loads ODELAY_VALUE tap delay in VARIABLE mode, in VAR_LOAD or
|
|
// VAR_LOAD_PIPE mode, loads the value of CNTVALUEIN
|
|
.LDPIPEEN(1'b0), // 1-bit input: Enables the pipeline register to load data
|
|
.ODATAIN(ODATAIN), // 1-bit input: Output delay data input
|
|
.REGRST(1'b0) // 1-bit input: Active-high reset tap-delay input
|
|
);
|
|
|
|
// check if delayed signal matches with the actual ODELAY primitive, if not then stop simulation
|
|
always @* begin
|
|
#1;
|
|
if((DATAOUT_test !== DATAOUT) && ($time > 500_000)) begin
|
|
$display("ODELAYE2 MODEL does not match: time = %t", $time);
|
|
unequal <= 1;
|
|
$stop;
|
|
end
|
|
end
|
|
initial begin
|
|
$display("---------------------------------------- TESTING ODELAYE2 Model ----------------------------------------");
|
|
end
|
|
end
|
|
end
|
|
//---------------------------------------------------------------------------------------//
|
|
//----------------------------------- ODELAY_TYPE = FIXED -------------------------------//
|
|
//---------------------------------------------------------------------------------------//
|
|
else if(ODELAY_TYPE == "FIXED") begin
|
|
initial delay_value = 600 + 78*ODELAY_VALUE;
|
|
if(TEST_MODEL == 1) begin
|
|
wire DATAOUT_test;
|
|
reg unequal = 0;
|
|
|
|
ODELAYE2 #(
|
|
.DELAY_SRC("ODATAIN"), // Delay input (ODATAIN, CLKIN)
|
|
.HIGH_PERFORMANCE_MODE("TRUE"), // Reduced jitter to 5ps ("TRUE"), Reduced power but high jitter 9ns ("FALSE")
|
|
.ODELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
|
|
.ODELAY_VALUE(ODELAY_VALUE), // Output delay tap setting (0-31)
|
|
.REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0).
|
|
.SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal
|
|
)
|
|
ODELAYE2_test_model_fixed (
|
|
.CNTVALUEOUT(), // 5-bit output: Counter value output
|
|
.DATAOUT(DATAOUT_test), // 1-bit output: Delayed data/clock output
|
|
.C(C), // 1-bit input: Clock input, when using OSERDESE2, C is connected to CLKDIV
|
|
.CE(1'b0), // 1-bit input: Active high enable increment/decrement input
|
|
.CINVCTRL(1'b0), // 1-bit input: Dynamic clock inversion input
|
|
.CLKIN(1'b0), // 1-bit input: Clock delay input
|
|
.CNTVALUEIN(0), // 5-bit input: Counter value input
|
|
.INC(1'b0), // 1-bit input: Increment / Decrement tap delay input
|
|
.LD(LD), // 1-bit input: Loads ODELAY_VALUE tap delay in VARIABLE mode, in VAR_LOAD or
|
|
// VAR_LOAD_PIPE mode, loads the value of CNTVALUEIN
|
|
.LDPIPEEN(1'b0), // 1-bit input: Enables the pipeline register to load data
|
|
.ODATAIN(ODATAIN), // 1-bit input: Output delay data input
|
|
.REGRST(1'b0) // 1-bit input: Active-high reset tap-delay input
|
|
);
|
|
// check if delayed signal matches with the actual ODELAY primitive, if not then stop simulation
|
|
always @* begin
|
|
#1;
|
|
if((DATAOUT_test !== DATAOUT) && ($time > 500_000)) begin
|
|
$display("ODELAYE2 MODEL does not match: time = %t", $time);
|
|
unequal <= 1;
|
|
$stop;
|
|
end
|
|
end
|
|
initial begin
|
|
$display("---------------------------------------- TESTING ODELAYE2 Model ----------------------------------------");
|
|
end
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
endmodule // ODELAYE2
|
|
|
|
`endcelldefine
|