ISERDES strange simulation behaviour

Aug 24, 2006 8 Replies

In the Virtex-4 user guide (ug070.pdf p.365 table 8-4) it is clearly indicated that for INTERFACE_TYPE=NETWOKING and DATA_RATE=SDR the latency should be 2 CLKDIV clock periods. I instantiated an ISERDES of DATA_WIDTH=6 but I see that valid output appears on the next CLKDIV rizing edge. Any explanations?



Merci d'avance!



Here is my code:



--------------CUT HERE FILE SERDES_inst.v--------------- module ISERDES_inst(CLK,CLKDIV,D,CE1,SR,REV, Q1,Q2,Q3,Q4,Q5,Q6); // I/O Ports // Inputs input CLK,CLKDIV,D,CE1,SR,REV; // Outputs output Q1,Q2,Q3,Q4,Q5,Q6;


// ISERDES: Source Synchronous Input Deserializer // Virtex-4 // Xilinx HDL Language Template version 8.1i ISERDES #( .BITSLIP_ENABLE("FALSE"), // TRUE/FALSE to enable bitslip controller .DATA_RATE("SDR"), // Specify data rate of "DDR" or "SDR" .DATA_WIDTH(6), // Specify data width - For DDR 4,6,8, or 10 // For SDR 2,3,4,5,6,7, or 8 .INIT_Q1(1'b0), // INIT for Q1 register - 1'b1 or 1'b0 .INIT_Q2(1'b0), // INIT for Q2 register - 1'b1 or 1'b0 .INIT_Q3(1'b0), // INIT for Q3 register - 1'b1 or 1'b0 .INIT_Q4(1'b0), // INIT for Q4 register - 1'b1 or 1'b0 .INTERFACE_TYPE("NETWORKING"), // Use model - "MEMORY" or "NETWORKING" .IOBDELAY("NONE"), // Specify outputs where delay chain will be applied // "NONE", "IBUF", "IFD", or "BOTH" .IOBDELAY_TYPE("DEFAULT"), // Set tap delay "DEFAULT", "FIXED", or "VARIABLE" .IOBDELAY_VALUE(0), // Set initial tap delay to an integer from 0 to 63 .NUM_CE(1), // Define number or clock enables to an integer of 1 or 2 .SERDES_MODE("MASTER"), // Set SERDES mode to "MASTER" or "SLAVE" .SRVAL_Q1(1'b0), // Define Q1 output value upon SR assertion -



1'b1 or 1'b0 .SRVAL_Q2(1'b0), // Define Q2 output value upon SR assertion -
1'b1 or 1'b0 .SRVAL_Q3(1'b0), // Define Q3 output value upon SR assertion -
1'b1 or 1'b0 .SRVAL_Q4(1'b0) // Define Q4 output value upon SR assertion -
1'b1 or 1'b0 ) my_ISERDES_inst ( .O(), // 1-bit combinatorial output .Q1(Q1), // 1-bit registered output .Q2(Q2), // 1-bit registered output .Q3(Q3), // 1-bit registered output .Q4(Q4), // 1-bit registered output .Q5(Q5), // 1-bit registered output .Q6(Q6), // 1-bit registered output .SHIFTOUT1(), // 1-bit carry output .SHIFTOUT2(), // 1-bit carry output .BITSLIP(), // 1-bit Bitslip input .CE1(CE1), // 1-bit clock enable input .CE2(), // 1-bit clock enable input .CLK(CLK), // 1-bit clock input .CLKDIV(CLKDIV), // 1-bit divided clock input .D(D), // 1-bit serial data input .DLYCE(), // 1-bit delay chain enable input .DLYINC(), // 1-bit delay increment/decrement input .DLYRST(), // 1-bit delay chain reset input .OCLK(), // 1-bit high-speed clock input .REV(REV), // 1-bit reverse SR input .SHIFTIN1(), // 1-bit carry input .SHIFTIN2(), // 1-bit carry input .SR(SR) // 1-bit set/reset input ); // End of ISERDES_inst instantiation

endmodule



-------------- END CUT HERE FILE SERDES_inst.v---------------


--------------CUT HERE FILE SERDES_inst_tb.v----------------- `timescale 1ns / 1ps module SERDES_inst_tb;



// Inputs reg CLK,CLKDIV,D,CE1,SR,REV;



// Outputs wire Q1,Q2,Q3,Q4,Q5,Q6;



// Parameters parameter CLK_PERIOD=2.85; parameter CLKDIV_PERIOD=CLK_PERIOD*6;



// Variables integer i=0;



// Instantiate the Unit Under Test (UUT) ISERDES_inst uut ( .CLK(CLK), .CLKDIV(CLKDIV), .D(D), .CE1(CE1), .SR(SR), .REV(REV), .Q1(Q1), .Q2(Q2), .Q3(Q3), .Q4(Q4), .Q5(Q5), .Q6(Q6) ); always #(CLK_PERIOD/2) CLK=~CLK; always #(CLKDIV_PERIOD/2) CLKDIV=~CLKDIV;


initial begin // Initialize Inputs CLK=1; CLKDIV=0; D=0; CE1=0; SR=0; REV=0;



// Wait 100 ns for global reset to finish #100;



// Add stimulus here // Testing availability of REV and the behaviour of SR @(negedge CLKDIV)#(0.5)REV=1; //#(CLKDIV_PERIOD); @(negedge CLKDIV)#(2)REV=0; #(2*CLKDIV_PERIOD); SR=1; #(CLKDIV_PERIOD)/*$stop*/; // Testing the ISERDES main functionality CE1=1; SR=0; @(posedge CLKDIV); @(negedge CLK); for(i=1;i


GaLaKtIkUs=99 schrieb:

advice: dont belive the simulator, its not always correct. place the iserdes and chipscope ILA into dummy toplevel, load some FPGA and look what happens in real silicon.

Antti

The only Virtex-4 based board I have is the ML403. Any advice on which I/O to use? Is it possible to use some signal on one the expansion headers? i.e to loop it back without load resistor? or I should use DCI?

GaLaKtIkUs=99 schrieb:

ut

gosh, just use any IO if some pins are accessible put a jumper on them for loopback, or use same io pin for in and out

Antti

he

tput

GA

I use the ZBT_SRAM_clk and clk_feedback present on the board. Thanks you for help.

A small question: what does mean gosh?

A+

GaLaKtIkUs=99 schrieb:

rly

the

output

FPGA

gosh no idea!

maybe is another perfectly perfect word, like "spunk" invented by Pippi

Antti

formatting link
gosh Pronunciation (gsh) interj. Used to express mild surprise or delight. [Alteration of God.]

Cheers, Martin

martin.j.thompson@trw.com TRW Conekt - Consultancy in Engineering, Knowledge and Technology http://www.conekt.net/electronics.html

Unfortunately the tests on the board using Chipscope gave the same results as in simulation. I looked for informations on this issue on Xilinx's site but I didn't found any thing. So I assume that the issue is that I didn't understand the table 8-4 in the Virtex-4 UserGuide. If you can help you're welcome (I can send you simulation/implementation files I used). I'm going to make the same simulations/tests on-board as described a few posts higher but for wordlengths>6 i.e where 2 ISERDES are needed.

Cheers

ut

The same thing for wordlength=3D8: the latency=3D1 clkdiv period in NETWORKING mode. Please can anybody confirm or infirm the information on table 8-4 un Virtex-4 User Guide?

Cheers

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required