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

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)

  • for循环之前的赋值就像一个默认值.最后的任务应该获胜.这两个比较不相等,因为`oneshot [i] == 1`将仅基于该位匹配.如果多个位为高,那么您将获得多个匹配. (2认同)

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)