2 // FIXME need to add flow control
7 wire ser_rx_clk, ser_tx_clk;
8 wire ser_rklsb, ser_rkmsb, ser_tklsb, ser_tkmsb;
9 wire [15:0] ser_r, ser_t;
13 initial #1000 rst = 0;
14 always #100 clk = ~clk;
18 wire [31:0] wb_dat_o_rx, wb_dat_o_tx;
19 reg wb_we, wb_en_rx, wb_en_tx;
23 reg go, clear, read, write;
25 wire [31:0] ctrl_word = {buf_num,3'b0,clear,write,read,step,lastline,firstline};
26 reg [8:0] firstline = 0, lastline = 0;
28 reg first_tx = 1, first_rx = 1; // for verif
34 wire [31:0] f2r_tx, r2f_tx;
36 wire read_tx, done_tx, error_tx, sop_tx, eop_tx;
38 wire fdone_tx, ferror_tx;
41 reg channel_error = 0;
45 .ser_tx_clk(ser_tx_clk),.ser_t(ser_t),.ser_tklsb(ser_tklsb),.ser_tkmsb(ser_tkmsb),
46 .rd_dat_i(data_tx),.rd_read_o(read_tx),.rd_done_o(done_tx),
47 .rd_error_o(error_tx),.rd_sop_i(sop_tx),.rd_eop_i(eop_tx) );
49 ram_2port #(.DWIDTH(32),.AWIDTH(9))
50 ram_tx(.clka(clk),.ena(wb_en_tx),.wea(wb_we_tx),.addra(wb_adr),.dia(wb_dat_i),.doa(wb_dat_o_tx),
51 .clkb(clk),.enb(en_tx),.web(we_tx),.addrb(addr_tx),.dib(f2r_tx),.dob(r2f_tx));
53 buffer_int #(.BUFF_NUM(1)) buffer_int_tx
55 .ctrl_word(ctrl_word),.go(go),
56 .done(fdone_tx),.error(ferror_tx),
58 .en_o(en_tx),.we_o(we_tx),.addr_o(addr_tx),.dat_to_buf(f2r_tx),.dat_from_buf(r2f_tx),
60 .wr_dat_i(0),.wr_write_i(0),.wr_done_i(0),
61 .wr_error_i(0),.wr_ready_o(),.wr_full_o(),
63 .rd_dat_o(data_tx),.rd_read_i(read_tx),.rd_done_i(done_tx),
64 .rd_error_i(error_tx),.rd_sop_o(sop_tx),.rd_eop_o(eop_tx) );
71 wire [31:0] f2r_rx, r2f_rx;
73 wire write_rx, done_rx, error_rx, ready_rx, empty_rx;
75 wire fdone_rx, ferror_rx;
79 .ser_rx_clk(ser_rx_clk),.ser_r(ser_r),.ser_rklsb(ser_rklsb),.ser_rkmsb(ser_rkmsb),
80 .wr_dat_o(data_rx),.wr_write_o(write_rx),.wr_done_o(done_rx),
81 .wr_error_o(error_rx),.wr_ready_i(ready_rx),.wr_full_i(full_rx) );
83 ram_2port #(.DWIDTH(32),.AWIDTH(9))
84 ram_rx(.clka(clk),.ena(wb_en_rx),.wea(wb_we_rx),.addra(wb_adr),.dia(wb_dat_i),.doa(wb_dat_o_rx),
85 .clkb(clk),.enb(en_rx),.web(we_rx),.addrb(addr_rx),.dib(f2r_rx),.dob(r2f_rx) );
87 buffer_int #(.BUFF_NUM(0)) buffer_int_rx
89 .ctrl_word(ctrl_word),.go(go),
90 .done(fdone_rx),.error(ferror_rx),
92 .en_o(en_rx),.we_o(we_rx),.addr_o(addr_rx),.dat_to_buf(f2r_rx),.dat_from_buf(r2f_rx),
94 .wr_dat_i(data_rx),.wr_write_i(write_rx),.wr_done_i(done_rx),
95 .wr_error_i(error_rx),.wr_ready_o(ready_rx),.wr_full_o(full_rx),
97 .rd_dat_o(),.rd_read_i(0),.rd_done_i(0),
98 .rd_error_i(0),.rd_sop_o(),.rd_eop_o() );
100 // Simulate the connection
101 serdes_model serdes_model
102 (.ser_tx_clk(ser_tx_clk), .ser_tkmsb(ser_tkmsb), .ser_tklsb(ser_tklsb), .ser_t(ser_t),
103 .ser_rx_clk(ser_rx_clk), .ser_rkmsb(ser_rkmsb), .ser_rklsb(ser_rklsb), .ser_r(ser_r),
104 .even(even), .error(channel_error) );
122 // receive a full buffer
126 // Receive a partial buffer
128 ReceiveSERDES(11,50);
130 // Receive too many for buffer
132 ReceiveSERDES(21,30);
134 // Send 3 packets, then wait to receive them, so they stack up in the rx fifo
140 ReceiveSERDES(31,40);
141 ReceiveSERDES(41,50);
144 ReceiveSERDES(51,60);
146 // Overfill the FIFO, should get an error on 3rd packet
157 ReceiveSERDES(101,500);
158 ReceiveSERDES(101,500);
163 always @(posedge clk)
165 $display("SERDES RX, FIFO WRITE %x, FIFO RDY %d, FIFO FULL %d",data_rx, ready_rx, full_rx);
167 always @(posedge clk)
169 $display("SERDES TX, FIFO READ %x, SOP %d, EOP %d",data_tx, sop_tx, eop_tx);
172 $dumpfile("serdes_tb.vcd");
173 $dumpvars(0,serdes_tb);
176 initial #10000000 $finish;
178 initial #259300 channel_error <= 1;
179 initial #259500 channel_error <= 0;
184 wb_dat_i <= 32'h10802000;
189 wb_dat_i <= wb_dat_i + 32'h00010001;
190 wb_adr <= wb_adr + 1;
196 $display("Done entering Data into TX RAM\n");
209 wb_adr <= wb_adr + 1;
215 $display("Done clearing RX RAM\n");
220 input [8:0] lastline;
226 repeat(lastline) begin
227 $display("ADDR: %h DATA %h", wb_adr, wb_dat_o_rx);
228 wb_adr <= wb_adr + 1;
232 $display("ADDR: %h DATA %h", wb_adr, wb_dat_o_rx);
235 $display("Done reading out RX RAM\n");
240 input [3:0] buffer_num;
242 buf_num <= buffer_num;
243 clear <= 1; read <= 0; write <= 0;
248 $display("Buffer Reset");
250 endtask // ClearBuffer
253 input [3:0] buffer_num;
257 buf_num <= buffer_num;
258 clear <= 0; read <= 0; write <= 1;
265 $display("Buffer Set for Write");
267 endtask // SetBufferWrite
270 input [3:0] buffer_num;
274 buf_num <= buffer_num;
275 clear <= 0; read <= 1; write <= 0;
282 $display("Buffer Set for Read");
284 endtask // SetBufferRead
288 while (!(fdone_tx | ferror_tx))
295 while (!(fdone_rx | ferror_rx))
309 SetBufferRead(1,start,stop);
312 endtask // SendSERDES
323 SetBufferWrite(0,start,stop);
326 endtask // ReceiveSERDES
328 endmodule // serdes_tb