如何使用SystemVerilog定义参数化多路复用器

问题描述 投票:5回答:3

我正在尝试创建一个模块,根据一个热输入将x个输入数据包切换到单个输出包。

如果x的固定值为4,我将创建一个case语句,

case (onehot)
  4'b0001  : o_data = i_data[0];
  4'b0010  : o_data = i_data[1];
  4'b0100  : o_data = i_data[2];
  4'b1000  : o_data = i_data[3];
  default  : o_data = 'z;
endcase

但是使用变量x,如何定义所有情况?

谢谢。

verilog system-verilog
3个回答
12
投票
parameter X = 4;  

input [X-1:0] onehot;
input i_data [X];
output reg o_data;

always_comb 
begin
   o_data = 'z;
   for(int i = 0; i < X; i++) begin
      if (onehot == (1 << i))
         o_data = i_data[i];
   end
end

10
投票

如果您可以断言onehot确实是单发或0,那么您可以使用生成]]

package mytypes;
typedef logic [7:0] packet_t;
endpackage 

module mux #(int X) (
      input logic [X-1:0] onehot,
      input mytypes::packet_t i_data[X],
      output wire mytypes::packet_t o_data
      );
for(genvar i=0;i<X;i++) begin
   assign o_data = onehot[i] ? i_data[i] : 'z;
end
endmodule

3
投票

这里是使用OR树为单次热输入(即无优先级编码)优化的完全参数化的可合成多路复用器。请注意,如果未启用任何输入,则输出将驱动为0而不是'z':

© www.soinside.com 2019 - 2024. All rights reserved.