`ifndef MPP_STREAM_MUX `define MPP_STREAM_MUX module mpp_stream_mux #( parameter NUM_CLIENTS = 2, parameter WIDTH = 8, parameter PIPE = 0, parameter [WIDTH-1:0] RESET = {WIDTH{1'b0}} ) ( input logic [ NUM_CLIENTS -1:0][WIDTH-1:0] ingress, input logic [ NUM_CLIENTS -1:0] ivalid, output logic [ NUM_CLIENTS -1:0] iready, output logic [WIDTH-1:0] egress, output logic evalid, input logic eready, input [$clog2(NUM_CLIENTS)-1:0] sel, input clk, input rst ); generate if (PIPE) begin : g_pipe logic reset_released; wire iready_pre = eready | ~evalid & reset_released; wire evalid_pre = ivalid[sel] | ~iready_pre & reset_released; assign iready = iready_pre << sel; always @(posedge clk or posedge rst) begin if (rst) begin evalid <= 1'b0; egress <= RESET; reset_released <= 1'b0; end else begin evalid <= evalid_pre; if (iready_pre & evalid_pre) egress <= ingress[sel]; reset_released <= 1'b1; end end end : g_pipe else begin : g_nopipe always_comb begin iready <= eready << sel; evalid <= ivalid [sel]; egress <= ingress [sel]; end end : g_nopipe endgenerate endmodule `endif /// MPP_STREAM_MUX
时间: 2024-02-15 16:28:54 浏览: 79
C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别
5星 · 资源好评率100%
这段代码是一个 Verilog 模块,用于多路复用数据流。模块有几个参数:NUM_CLIENTS 表示数据流的输入数量,WIDTH 表示每个输入数据流的位宽,PIPE 表示是否启用流水线,RESET 是一个参数向量,用于指定每个输入数据流的复位值。模块有以下输入和输出:
- ingress: 输入数据流,是一个 NUM_CLIENTS x WIDTH 的逻辑向量矩阵。
- ivalid: 输入数据流的有效信号,是一个 NUM_CLIENTS 的逻辑向量。
- ivalid: 输出数据流的就绪信号,是一个 NUM_CLIENTS 的逻辑向量。
- egress: 输出数据流,是一个 WIDTH 位宽的逻辑向量。
- evalid: 输出数据流的有效信号,是一个逻辑变量。
- eready: 输出数据流的就绪信号,是一个逻辑变量。
- sel: 选择输入数据流的索引,是一个 $clog2(NUM_CLIENTS)$ 位宽的逻辑向量。
- clk: 时钟信号,是一个逻辑变量。
- rst: 复位信号,是一个逻辑变量。
模块的功能是选择一个输入数据流并将其发送到输出数据流中。如果启用了流水线,则模块会在时钟上升沿时更新输出数据流的有效信号和输出数据,以及在复位时将输出数据流的有效信号设置为 0。如果未启用流水线,则模块会在输入信号变化时立即更新输出信号。
阅读全文