The Designer's Guide Community Forum
https://designers-guide.org/forum/YaBB.pl Design >> Mixed-Signal Design >> Random data signal in cadence https://designers-guide.org/forum/YaBB.pl?num=1137083282 Message started by rjshmadala on Jan 12th, 2006, 8:37am |
Title: Random data signal in cadence Post by rjshmadala on Jan 12th, 2006, 8:37am hello, which signal in cadence should use to rpoduce a random binary data input signal (0101010010010100101....)for clock and data recovery circuits.(or)in D flip flop Regards Rjshmadala |
Title: Re: Random data signal in cadence Post by Andrew Beckett on Jan 12th, 2006, 10:26am If you use ahdlLib (in <instdir>/tools/dfII/samples/artist), there is a verilog-a model in there called rand_bit_stream - so you can use that. Regards, Andrew. |
Title: Re: Random data signal in cadence Post by Ken Kundert on Jan 13th, 2006, 8:28am You'll also find some random bit stream generators at verilog-ams.com. -Ken |
Title: Re: Random data signal in cadence Post by gitarrelieber on Apr 11th, 2006, 6:56am Suggest to write a PRBS generator in verilog-a. Important is to implement the random sequence which can be sent by a bit error rate tester (BERT). |
Title: Re: Random data signal in cadence Post by jbdavid on Apr 15th, 2006, 2:26pm The standard logical model of a prbs source is a simple shift register with a couple of OR gates on the appropriate bits to get a Maximal Length Sequence.. the tutorial here looks like a decent explanation. http://www.newwaveinstruments.com/resources/articles/m_sequence_linear_feedback_shift_register_lfsr.htm with some tables.. - in verilog A, once you have the Length you want, and the MLE polynomial, just use an "integer" to hold the value , shift it left, and or the output (old MSB) with the selected bits to get the new LSB.. |
Title: Re: Random data signal in cadence Post by jbdavid on Apr 15th, 2006, 3:07pm [font=Courier][/font] for prbs 7 parameter integer xorbits = 3<<5; parameter integer seed = 3; integer code newbit bitcode i; analog begin ... ... @(initial_step) begin code = seed; end @(timer(period, period)) begin newbit = 0; bitcode = (code & xorbits); ; now xor the results for (i=0; i<7 ; i = i+1) begin newbit = (newbit ^bitcode)&1; bitcode = bitcode >>1; end code = (code <<1)|newbit; end ... V(out) <+ transistion((code&1? vhi: vlo), 0, tr, tf); --- your milage may vary.. especially if your seed is right (ie All Zeros usually generates a minimal length ) or your pattern (1100000 in this case 3<<5) is not one of the ones from the table.. (which will mean that you don't get a Maximal Length sequence.. ) (imagine a pythonized version ? ) @initial_step: code = seed; @timer start period repeat period: newbit = 0 bitcode = (code & xorbits) # now xor the results for i in [0,1,2,3,4,5,6] newbit = (newbit ^bitcode)&1 bitcode = bitcode >>1 code = (code <<1)|newbit; V(out) <+ transition((code?vhi:vlo),0,tr) jbd |
Title: Re: Random data signal in cadence Post by gitarrelieber on Apr 18th, 2006, 6:07am Here is also a code example for PRBS generator. // VerilogA for wk_hu, prbs_gen, veriloga `include "constants.vams" `include "disciplines.vams" module prbs_gen(clkp, clkn, outx, outb); input clkp, clkn; output outx, outb; voltage clkp, clkn, outx, outb; parameter integer bit_num = 8 from [2:32]; parameter integer seed = 1 from [1:inf]; integer x, a1, a2, a3, a4, b, mask; analog begin @(initial_step) begin case (1) (bit_num == 2): begin a1=0; a2= 1; a3= 0; a4= 0; end // 2 [0,1] (bit_num == 3): begin a1=0; a2= 2; a3= 0; a4= 0; end // 3 [0,2] (bit_num == 4): begin a1=0; a2= 3; a3= 0; a4= 0; end // 4 [0,3] (bit_num == 5): begin a1=1; a2= 4; a3= 0; a4= 0; end // 5 [1,4] (bit_num == 6): begin a1=0; a2= 5; a3= 0; a4= 0; end // 6 [0,5] (bit_num == 7): begin a1=0; a2= 6; a3= 0; a4= 0; end // 7 [0,6] (bit_num == 8): begin a1=1; a2= 2; a3= 3; a4= 7; end // 8 [1,2,3,7] (bit_num == 9): begin a1=3; a2= 8; a3= 0; a4= 0; end // 9 [3,8] (bit_num == 10): begin a1=2; a2= 9; a3= 0; a4= 0; end //10 [2,9] (bit_num == 11): begin a1=1; a2=10; a3= 0; a4= 0; end //11 [1,10] (bit_num == 12): begin a1=0; a2= 3; a3= 5; a4=11; end //12 [0,3,5,11] (bit_num == 13): begin a1=0; a2= 2; a3= 3; a4=12; end //13 [0,2,3,12] (bit_num == 14): begin a1=0; a2= 2; a3= 4; a4=13; end //14 [0,2,4,13] (bit_num == 15): begin a1=0; a2=14; a3= 0; a4= 0; end //15 [0,14] (bit_num == 16): begin a1=1; a2= 2; a3= 4; a4=15; end //16 [1,2,4,15] (bit_num == 17): begin a1=2; a2=16; a3= 0; a4= 0; end //17 [2,16] (bit_num == 18): begin a1=6; a2=17; a3= 0; a4= 0; end //18 [6,17] (bit_num == 19): begin a1=0; a2= 1; a3= 4; a4=18; end //19 [0,1,4,18] (bit_num == 20): begin a1=2; a2=19; a3= 0; a4= 0; end //20 [2,19] (bit_num == 21): begin a1=1; a2=20; a3= 0; a4= 0; end //21 [1,20] (bit_num == 22): begin a1=0; a2=21; a3= 0; a4= 0; end //22 [0,21] (bit_num == 23): begin a1=4; a2=22; a3= 0; a4= 0; end //23 [4,22] (bit_num == 24): begin a1=0; a2= 2; a3= 3; a4=23; end //24 [0,2,3,23] (bit_num == 25): begin a1=7; a2=25; a3= 0; a4= 0; end //25 [7,25] (bit_num == 26): begin a1=0; a2= 1; a3= 5; a4=25; end //26 [0,1,5,25] (bit_num == 27): begin a1=0; a2= 1; a3= 4; a4=26; end //27 [0,1,4,26] (bit_num == 28): begin a1=2; a2=27; a3= 0; a4= 0; end //28 [2,27] (bit_num == 29): begin a1=1; a2=28; a3= 0; a4= 0; end //29 [1,28] (bit_num == 30): begin a1=0; a2= 3; a3= 5; a4=29; end //30 [0,3,5,29] (bit_num == 31): begin a1=2; a2=30; a3= 0; a4= 0; end //31 [2,30] (bit_num == 32): begin a1=1; a2= 5; a3= 6; a4=31; end //32 [1,5,6,31] default $strobe("Error. Should never get here."); endcase mask = pow(2, bit_num) -1; x = seed; x = x & mask; //mask the unavailable bit; end @(cross(V(clkp, clkn), +1, 10p)) begin b = ((x>>a1)^(x>>a2)^(x>>a3)^(x>>a4))%2; x = ((x<<1) & (mask-1)) + b; end V(outx) <+ x; V(outb) <+ b; end endmodule |
Title: Re: Random data signal in cadence Post by jbdavid on Apr 21st, 2006, 1:10am Its certainly several times the code of my model.. What theory is it based on? (always a good idea to put a reference to theory behind the model in a case like this.. ) what is the maximal lenght pattern ? Jonathan |
Title: Re: Random data signal in cadence Post by gitarrelieber on Apr 24th, 2006, 5:00am I coded the PRBS generator in this way so that different PRBS configuration (PRBS2..PRBS32) can be easily achieved by changing the module parameter bit_num. This is done in @(initial_step). The module parameter bit_num is the length of the linear feedback shift register (LFSR). The variable x is the bits of the LFSR. The variable mask is used to mask the unused bits in x. For instance, if bit_num is 7, then the variable mask is equal to ...001111111b, which means only the last 7 bits of x is actually used and the unused bits are all set to 0. The variable a1, a2, a3 and a4 determine which bits of the LFSR should be XORed together and fed back. The feedback bit b is calculated as b = ((x>>a1)^(x>>a2)^(x>>a3)^(x>>a4))%2; The feedback bit b is added to the variable x as LSB. The setting of [a1, a2, a3, a4] is copied from the webpage http://www.maxim-ic.com/appnotes.cfm?appnote_number=1743&CMP=WP-9 The valid maximum run length is 32-bit. It is of course possible to extend the bit_num to more than 32. But I am not sure how many bits does an integer have in Verilog-A language. I do not know whether Verilog-A language has the key word "generate" like VHDL, with which the bit number can be flexibly altered. |
Title: Re: Random data signal in cadence Post by neoflash on Nov 18th, 2006, 6:50am gitarrelieber wrote on Apr 18th, 2006, 6:07am:
I am curious how case(1) works? It seems no manual support such syntax? |
Title: Re: Random data signal in cadence Post by jbdavid on Dec 3rd, 2006, 8:36pm >>I am curious how case(1) works? It seems no manual support such syntax? case (arg) looks for the first of the case statements whose value matches "arg" so case (1) looks for the first of the following statements that evaluates to "1" (or is True) jbd |
The Designer's Guide Community Forum » Powered by YaBB 2.2.2! YaBB © 2000-2008. All Rights Reserved. |