⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 receive_tb.v

📁 基于802.3以太网的mac源码
💻 V
📖 第 1 页 / 共 2 页
字号:
        frame3.ctrl[18] = 4'b0000;        frame3.ctrl[19] = 4'b0000;        frame3.ctrl[20] = 4'b0000;        frame3.ctrl[21] = 4'b0000;        frame3.ctrl[22] = 4'b0000;        frame3.ctrl[23] = 4'b0000;        frame3.ctrl[24] = 4'b0000;        frame3.ctrl[25] = 4'b0000;        frame3.ctrl[26] = 4'b0000;        frame3.ctrl[27] = 4'b0000;        frame3.ctrl[28] = 4'b0000;        frame3.ctrl[29] = 4'b0000;        frame3.ctrl[30] = 4'b0000;        frame3.ctrl[31] = 4'b0000;                frame3.crc = 32'h6B734A56;                frame3.underrun = 1'b0;     end  // initial  // DUT signals  reg reset;   //Client transmitter signals  //client receiver signals    wire [63:0] rx_data;  wire [7:0] rx_data_valid;  wire rx_good_frame;  wire rx_bad_frame;  wire rx_clk;  reg  rxclk_2x;  wire [28:0] rx_statistics_vector;  wire rx_statistics_valid;  reg  xgmii_rx_clk;  reg  [31:0] xgmii_rxd;  reg  [3:0]  xgmii_rxc;   reg   rx_monitor_finished;   wire  simulation_finished;     /*---------------------------------------------------------------------------  -- wire up Device Under Test  ---------------------------------------------------------------------------*/  wire [64:0] configuration_vector;   	rxReceiveEngine uut (		.xgmii_rxclk(xgmii_rx_clk),		.rxclk_2x(rxclk_2x), 		.reset_in(reset),		.rxclk_out(rx_clk),		.xgmii_rxd(xgmii_rxd), 		.xgmii_rxc(xgmii_rxc), 		.rxStatRegPlus(), 		.cfgRxRegData_in(configuration_vector), 		.rx_data(rx_data), 		.rx_data_valid(rx_data_valid), 		.rx_good_frame(rx_good_frame), 		.rx_bad_frame(rx_bad_frame), 		.rxCfgofRS(), 		.rxTxLinkFault()//		.fcTxPauseData(), //		.fcTxPauseValid()	);   assign configuration_vector = {1'b0, 64'h058b010203040506}; //fcs in-band invalid	//assign configuration_vector = {1'b0, 64'h058f010203040506}; // fcs in-band valid /*---------------------------------------------------------------------------  -- Clock drivers  ---------------------------------------------------------------------------*/   initial     begin        xgmii_rx_clk <= 1;        #1000;        forever          begin             #3200;             xgmii_rx_clk <= 0;             #3200;             xgmii_rx_clk <= 1;          end     end // initial begin      initial     begin        rxclk_2x <= 1;        #1000;        forever          begin             #1600;             rxclk_2x <= 0;             #1600;             rxclk_2x <= 1;          end     end // initial begin      /* RX Stimulus process - insert frames into the PHY side of the     * receiver    */   task rx_stimulus_send_column;      input [31:0] d;      input [ 3:0] c;      begin         @(posedge xgmii_rx_clk or negedge xgmii_rx_clk);         #1600;         xgmii_rxd <= d;         xgmii_rxc <= c;      end   endtask // rx_stimulus_send_column   task rx_stimulus_send_idle;      begin         rx_stimulus_send_column(32'h07070707,4'b1111);      end   endtask // rx_stimulus_send_idle      task rx_stimulus_send_frame;      input `FRAME_TYP frame;      integer column_index, lane_index, byte_count, I, J;      reg [31:0] scratch_column_data, current_column_data;      reg [ 3:0] scratch_column_ctrl, current_column_ctrl;      reg [ 7:0] code_temp;      begin         rx_stimulus_working_frame.frombits(frame);         column_index = 0;         lane_index = 0;         byte_count = 0;         // send preamble         rx_stimulus_send_column(32'h555555FB, 4'b0001);         rx_stimulus_send_column(32'hD5555555, 4'b0000);         // send complete columns         while (rx_stimulus_working_frame.ctrl[column_index] === 4'b1111)           begin              rx_stimulus_send_column(rx_stimulus_working_frame.data[column_index],                                      4'b0000);              column_index = column_index + 1;              byte_count = byte_count + 4;           end         current_column_data = rx_stimulus_working_frame.data[column_index];         current_column_ctrl = rx_stimulus_working_frame.ctrl[column_index];         while (current_column_ctrl[lane_index])           begin              for (J = 0; J < 8; J = J + 1)                scratch_column_data[lane_index*8+J] =                        current_column_data[lane_index*8+J];              scratch_column_ctrl[lane_index] = 0;              lane_index = lane_index + 1;              byte_count = byte_count + 1;           end         // send any padding required         while (byte_count < `MIN_FRAME_DATA_BYTES)           begin              if (lane_index == 4)                begin                   rx_stimulus_send_column(scratch_column_data,                                           scratch_column_ctrl);                   lane_index = 0;                end              for (J = 0; J < 8; J = J + 1)                scratch_column_data[lane_index*8+J] = 0;              scratch_column_ctrl[lane_index] = 0;              lane_index = lane_index + 1;              byte_count = byte_count + 1;           end // while (byte_count < `MIN_FRAME_DATA_BYTES)         // send the CRC         for (I = 3; I >= 0; I = I - 1)           begin              if (lane_index == 4)                begin                   rx_stimulus_send_column(scratch_column_data,                                           scratch_column_ctrl);                   lane_index = 0;                end              for (J = 0; J < 8; J = J + 1)                scratch_column_data[lane_index*8+J] =                        rx_stimulus_working_frame.crc[I*8+J];              scratch_column_ctrl = 0;              lane_index = lane_index + 1;           end // for (I = 3; I >= 0; I = I - 1)         // send the terminate/error column         if (lane_index == 4)           begin              rx_stimulus_send_column(scratch_column_data,                                      scratch_column_ctrl);              lane_index = 0;           end         // send an /E/ if underrun, /T/ if not         code_temp = rx_stimulus_working_frame.underrun ? 8'hFE : 8'hFD;         for (J = 0; J < 8; J = J + 1)           scratch_column_data[lane_index*8+J] = code_temp[J];         scratch_column_ctrl[lane_index] = 1;         lane_index = lane_index + 1;         while (lane_index < 4)           begin              code_temp = 8'h07;              for (J = 0; J < 8; J = J + 1)                scratch_column_data[lane_index*8+J] = code_temp[J];              scratch_column_ctrl[lane_index] = 1;              lane_index = lane_index + 1;           end         rx_stimulus_send_column(scratch_column_data,                                 scratch_column_ctrl);         $display("Receiver: frame inserted into PHY interface");      end   endtask // rx_stimulus_send_frame   initial     begin : p_rx_stimulus        integer I;        $display("Timing checks are not valid");        while (reset !== 0)          rx_stimulus_send_idle;        for (I = 0; I < 100; I = I + 1)          rx_stimulus_send_idle;        $display("Timing checks are valid");        rx_stimulus_send_frame(frame0.tobits(0));        rx_stimulus_send_idle;        rx_stimulus_send_idle;        rx_stimulus_send_frame(frame1.tobits(0));        rx_stimulus_send_idle;        rx_stimulus_send_idle;        rx_stimulus_send_frame(frame2.tobits(0));        rx_stimulus_send_idle;        rx_stimulus_send_idle;        rx_stimulus_send_frame(frame3.tobits(0));        while (1)          rx_stimulus_send_idle;     end // block: p_rx_stimulus   /* rx monitor - checks that the receiver extracts the information    * inserted into the PHY interface    */   task wait_on_rx_clk;      begin         @(posedge rx_clk);         #6399;      end   endtask // wait_on_rx_clk      task rx_monitor_check_frame;      input `FRAME_TYP frame;      integer column_count, I, J;      reg [31:0] current_column_data;      reg good_frame_flagged;      reg bad_frame_flagged;      reg wrong;      begin         rx_monitor_working_frame.frombits(frame);         column_count = 0;         wrong = 0;         // wait for the first real column of data         while (rx_data_valid === 8'b00000000)           wait_on_rx_clk;         // frame has started, get columns of frame         while (rx_data_valid !== 8'b00000000)           begin              // only check contents of good frames              if (!rx_monitor_working_frame.underrun)                begin                   if (rx_data_valid !== { rx_monitor_working_frame.ctrl[column_count+1],                                            rx_monitor_working_frame.ctrl[column_count] })                     $display("ERROR: Receiver fail: RX_DATA_VALID incorrect rx_data_valid is %x, expected is %x %x",rx_data_valid,rx_monitor_working_frame.ctrl[column_count+1],rx_monitor_working_frame.ctrl[column_count]);                   current_column_data = rx_monitor_working_frame.data[column_count];                   for (I = 0; I < 4; I = I + 1)                     if (rx_data_valid[I])                       for (J = 0; J < 8; J = J + 1)                         if (rx_data[I*8+J] !== current_column_data[I*8+J])                            wrong = 1;                   if(wrong == 1)                     $display("ERROR: Receiver fail : 1 RX_DATA incorrect rx_data is %x, expected is %x",rx_data[31:0],current_column_data[31:0]);                   current_column_data = rx_monitor_working_frame.data[column_count+1];                   wrong = 0;                   for (I = 4; I < 8; I = I + 1)                     if (rx_data_valid[I])                       for (J = 0; J < 8; J = J + 1)                         if (rx_data[I*8+J] !== current_column_data[(I-4)*8+J])                            wrong = 1;                   if(wrong == 1)                       $display("ERROR: Receiver fail : 2 RX_DATA incorrect rx_data is %x, expected is %x",rx_data[63:32],current_column_data[31:0]);                end // if (!rx_monitor_working_frame.underrun)              good_frame_flagged = rx_good_frame;              bad_frame_flagged = rx_bad_frame;              column_count = column_count + 2;              wait_on_rx_clk;           end // while (RX_DATA_VALID != 8'b00000000)         // check whether the frame has been flagged at the right time         while (!good_frame_flagged && !bad_frame_flagged)           begin              good_frame_flagged = rx_good_frame;              bad_frame_flagged = rx_bad_frame;              if (rx_data_valid !== 8'b00000000)                $display("ERROR: Receiver fail: New frame received before good/bad flag from previous frame");              wait_on_rx_clk;           end         if (rx_monitor_working_frame.underrun)           begin              if (good_frame_flagged)                $display("ERROR: Receive Fail: bad frame flagged as good");           end         else           begin              if (bad_frame_flagged)                $display("ERROR: Receive Fail: good frame flagged as bad");           end         $display("Receiver: Frame extracted from client interface");      end   endtask // rx_monitor_check_frame   /*---------------------------------------------------------------------------  -- RX Monitor process. This process checks the data coming out of the    receiver  -- to make sure that it matches that inserted into the transmitter.  ---------------------------------------------------------------------------*/  initial    begin : p_rx_monitor       rx_monitor_finished = 0;              // first, get synced up with the RX clock       @(negedge reset)         wait_on_rx_clk;       rx_monitor_check_frame(frame0.tobits(0));       rx_monitor_check_frame(frame1.tobits(0));       rx_monitor_check_frame(frame2.tobits(0));       rx_monitor_check_frame(frame3.tobits(0));       rx_monitor_finished = 1;    end // block: p_rx_monitor   // reset process   initial     begin        $display("Resetting the core...");        reset <= 1;        #200000;        reset <= 0;     end   // Simulation control   assign simulation_finished =      rx_monitor_finished     ;   initial     begin        fork: sim_in_progress          @(posedge simulation_finished) disable sim_in_progress;           #10000000                     disable sim_in_progress;        join        if (simulation_finished)          $display("** Finish: Simulation Stopped");        else          $display("** Failure: ERROR: Testbench timed out");                  $stop;     end // initial beginendmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -