network_interface.v

来自「基于4个mips核的noc设计」· Verilog 代码 · 共 313 行

V
313
字号
module NETWORK_INTERFACE(clk, rst, reg_data_in, write_data, write_addr, send, packet_end, read, reg_data_out, data_rdy, rcv_packet_end, send_rdy, data_in, req_in, ack_in, data_out, req_out, ack_out);    input clk;    wire clk;    input rst;    wire rst;    input [31:0] reg_data_in;    wire [31:0] reg_data_in;    input write_data;    wire write_data;    input write_addr;    wire write_addr;    input send;    wire send;    input packet_end;    wire packet_end;    input read;    wire read;    output [31:0] reg_data_out;    reg [31:0] reg_data_out;    output data_rdy;    reg data_rdy;    output rcv_packet_end;    reg rcv_packet_end;    output send_rdy;    reg send_rdy;    input [17:0] data_in;    wire [17:0] data_in;    input req_in;    wire req_in;    input ack_in;    wire ack_in;    output [17:0] data_out;    reg [17:0] data_out;    output req_out;    reg req_out;    output ack_out;    reg ack_out;    reg [31:0] buffer_in;    reg [31:0] buffer_out;    reg [15:0] addr;    reg [15:0] buffer_addr;    reg packet_end_reg;    reg wr_packet_end;    reg [1:0] flit_type_v;    reg [7:0] addrx;    reg [7:0] addry;    reg [15:0] flit_data_v;    reg [1:0] next_send_flit;    reg [1:0] send_flit;    reg [2:0] send_next_state;    reg req_out_v;    reg send_rdy_v;    reg wr_packet_end_v;    reg [1:0] __tmp69;    reg [2:0] send_current_state;    reg [1:0] flit_type__1;    reg [1:0] rcv_next_state;    reg [1:0] next_rcv_flit;    reg [1:0] rcv_flit;    reg [31:0] buffer_in_n;    reg ack_out_v;    reg data_rdy_v;    reg rcv_packet_end_v;    reg [1:0] rcv_current_state;        always @(buffer_in)        begin : forward_buffer            reg_data_out = buffer_in;        end        always @(posedge clk or posedge rst)        begin : buffer_out_process            if (rst)                buffer_out <= 32'b00000000000000000000000000000000;            else            begin                if (write_data)                    buffer_out <= reg_data_in;            end        end        always @(posedge clk or posedge rst)        begin : buffer_addr_process            if (rst)            begin                addr = reg_data_in[15:0];                buffer_addr <= 16'b0000000000000000;            end            else            begin                addr = reg_data_in[15:0];                if (write_addr)                    buffer_addr <= addr;            end        end        always @(posedge clk or posedge rst)        begin : register_packet_end            if (rst)                packet_end_reg <= 0;            else            begin                if (wr_packet_end)                    packet_end_reg <= packet_end;            end        end        always @(send_current_state or send_flit or send or buffer_out or buffer_addr or ack_in or packet_end_reg)        begin : send_logic            flit_type_v = 2'b00;            addrx = buffer_addr[15:8];            addry = buffer_addr[7:0];            flit_data_v = 16'b0000000000000000;            next_send_flit = send_flit;            send_next_state = 3'b000;            req_out_v = 0;            send_rdy_v = 0;            wr_packet_end_v = 0;            case (send_current_state) //synopsys parallel_case full_case            0:              if (send)            begin                send_next_state = 3'b001;                next_send_flit = 2'b01;                wr_packet_end_v = 1;            end            else            begin                send_next_state = 3'b000;                next_send_flit = 2'b00;                send_rdy_v = 1;            end            1:  begin                req_out_v = 1;                case (send_flit) //synopsys parallel_case                1:  begin                    flit_type_v = 2'b01;                    flit_data_v = {addrx, addry};                end                2:  begin                    flit_type_v = 2'b00;                    flit_data_v = buffer_out[31:16];                end                3:  begin                    if (packet_end_reg)                        __tmp69 = 2'b10;                    else                        __tmp69 = 2'b00;                    flit_type_v = __tmp69;                    flit_data_v = buffer_out[15:0];                end                default : begin                     end                endcase                if (ack_in)                    send_next_state = 3'b010;                else                    send_next_state = 3'b001;            end            2:              if (!ack_in)                case (send_flit) //synopsys parallel_case                1:  begin                    send_next_state = 3'b001;                    next_send_flit = 2'b10;                end                2:  begin                    send_next_state = 3'b001;                    next_send_flit = 2'b11;                end                3:  begin                    send_next_state = 3'b011;                    next_send_flit = 2'b00;                    send_rdy_v = 1;                end                default : begin                     end                endcase            else                send_next_state = 3'b010;            3:  begin                send_rdy_v = 1;                if (!send)                begin                    if (packet_end_reg)                        send_next_state = 3'b000;                    else                        send_next_state = 3'b100;                end                else                    send_next_state = 3'b011;            end            4:  begin                next_send_flit = 2'b10;                if (send)                begin                    send_next_state = 3'b001;                    wr_packet_end_v = 1;                end                else                begin                    send_next_state = 3'b100;                    send_rdy_v = 1;                end            end            endcase            wr_packet_end = wr_packet_end_v;            req_out = req_out_v;            send_rdy = send_rdy_v;            data_out = {flit_type_v, flit_data_v};        end        always @(posedge clk or posedge rst)        begin : send_change_state            if (rst)            begin                send_current_state <= 3'b000;                send_flit <= 2'b00;            end            else            begin                send_current_state <= send_next_state;                send_flit <= next_send_flit;            end        end        always @(rcv_current_state or rcv_flit or req_in or data_in or buffer_in or read)        begin : rcv_logic            flit_type__1 = data_in[17:16];            rcv_next_state = 2'b00;            next_rcv_flit = rcv_flit;            buffer_in_n = buffer_in;            ack_out_v = 0;            data_rdy_v = 0;            rcv_packet_end_v = 0;            case (rcv_current_state) //synopsys parallel_case full_case            0:              if (req_in)            begin                rcv_next_state = 2'b01;                case (rcv_flit) //synopsys parallel_case full_case                0:  begin                    buffer_in_n = 32'b00000000000000000000000000000000;                    next_rcv_flit = 2'b01;                end                1:                  buffer_in_n = 32'b00000000000000000000000000000000;                2:                  buffer_in_n = {data_in[15:0], buffer_in[15:0]};                3:                  buffer_in_n = {buffer_in[31:16], data_in[15:0]};                endcase            end            else                rcv_next_state = 2'b00;            1:  begin                ack_out_v = 1;                if (!req_in)                    case (rcv_flit) //synopsys parallel_case                    1:  begin                        rcv_next_state = 2'b00;                        next_rcv_flit = 2'b10;                    end                    2:  begin                        rcv_next_state = 2'b00;                        next_rcv_flit = 2'b11;                    end                    3:  begin                        rcv_next_state = 2'b10;                        if (flit_type__1 == 2'b10)                            next_rcv_flit = 2'b00;                        else                            next_rcv_flit = 2'b10;                    end                    default : begin                         end                    endcase                else                    rcv_next_state = 2'b01;            end            2:  begin                data_rdy_v = 1;                rcv_packet_end_v = rcv_flit == 2'b00;                if (read)                    rcv_next_state = 2'b00;                else                    rcv_next_state = 2'b10;            end            endcase            ack_out = ack_out_v;            data_rdy = data_rdy_v;            rcv_packet_end = rcv_packet_end_v;        end        always @(posedge clk or posedge rst)        begin : rcv_change_state            if (rst)            begin                rcv_current_state <= 2'b00;                rcv_flit <= 2'b00;                buffer_in <= 32'b00000000000000000000000000000000;            end            else            begin                rcv_current_state <= rcv_next_state;                rcv_flit <= next_rcv_flit;                buffer_in <= buffer_in_n;            end        endendmodule

⌨️ 快捷键说明

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