我正在尝试创建一个模块,根据一个热输入将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,如何定义所有情况?
谢谢。
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
如果您可以断言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
这里是使用OR树为单次热输入(即无优先级编码)优化的完全参数化的可合成多路复用器。请注意,如果未启用任何输入,则输出将驱动为0而不是'z':