Verilog部分选择在genvar上下文中

时间:2016-05-03 15:40:35

标签: verilog

我正在尝试多路复用过滤器模块的输入,但我的语法有困难。有人可以帮忙吗?我在想,

reg [y:0] MULTICHANNEL_INPUT;
wire [x:0] channelDataIn;
wire [1:0] channelNumberIn;

Filter XYZ (
...
.chan_in(channelNumberIn), 
.din(channelDataIn),             //[x:0] data in
...
);

always @ (*)
 case(channelNumberIn) 
   0:  assign channelDataIn = MULTICHANNEL_INPUT[x:0]
   1:  assign channelDataIn = MULTICHANNEL_INPUT[2x:x+1]
   ...
 endcase

但是这不能编译。我该怎么做?

2 个答案:

答案 0 :(得分:1)

我正在猜测你想要完成什么,但如果你只想抓住一部分矢量你可以使用索引部分选择

module test
 #(
   parameter x = 4,
   parameter y = 4*x
  )
  (
   input [y-1:0] MULTICHANNEL_INPUT,
   input [1:0] channelNumberIn,
   output reg [x-1:0] channelDataIn
  )

    always_comb begin
      case(channelNumberIn)
        2'd0: channelDataIn = MULTICHANNEL_INPUT[1*x-1:0*x];
        2'd1: channelDataIn = MULTICHANNEL_INPUT[2*x-1:1*x];
        2'd2: channelDataIn = MULTICHANNEL_INPUT[3*x-1:2*x];
        2'd3: channelDataIn = MULTICHANNEL_INPUT[4*x-1:3*x];
      endcase
    end

endmodule

这也可以通过案例陈述来完成:

reg

请注意,我必须将输出设为always,因为它是在wire [3:0][x-1:0] input_2d; assign input_2d = MULTICHANNEL_INPUT; assign channelDataIn = input_2d[channelNumberIn]; 块内驱动的。但是,这并没有改变任何事情。这两个模块应该合成到相同的门。我更喜欢第一种解决方案,因为它不易出错:第二种解决方案中的拼写错误可能导致部分选择重叠。

另一种选择只是为了好玩。我不喜欢这个,因为不太清楚发生了什么,你冒着让尺寸倒退的风险(我不确定我是否真的在这里做过)​​:

CASE

答案 1 :(得分:0)

获取未注册的多路复用器的一种简单方法是使用连续分配

to_char