use*_*276 4 verilog system-verilog
我正在尝试创建一个模块,根据一个热输入将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
Run Code Online (Sandbox Code Playgroud)
但是对于变量x,我该如何定义所有情况?
谢谢.
ngu*_*rie 10
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
Run Code Online (Sandbox Code Playgroud)
dav*_*_59 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
Run Code Online (Sandbox Code Playgroud)