不同宽度的变址寄存器

Index register with different widths

有没有办法索引一个偏移量相同但宽度可变的多位寄存器?我想这样做:

module foo (input [1:0] data_bits);
always @ (posedge clk) begin
case (data_bits)
    2'b11:
        assign wire_data_out = {3(1'b0), data_received[7:3]};
    2'b10:
        assign wire_data_out = {2(1'b0), data_received[7:2]};
    2'b01:
        assign wire_data_out = {(1'b0), data_received[7:1]};
    2'b00:
        assign wire_data_out = data_received;
endcase
end

搜索答案我找到了索引部分 Select 运算符“+: 或 -:”,但它需要固定宽度,这不符合我的需要。上面的代码有没有更简单的写法?

always @ (posedge clk)
   wire_data_out <= data_received>>data_bits;

顺便说一句:

  1. 您不能在 always 块中使用赋值。
  2. 在时钟部分,您应该使用非阻塞分配。

如您所愿,单行。但我不会那样写我的代码。它要求 reader 知道 Verilog 会将零位添加到顶部并丢失底部位。我会使用你写的代码(但没有语法错误:-):

always @ (posedge clk) begin
   case (data_bits)
   2'b00: wire_data_out <=       data_received;
   2'b01: wire_data_out <= {1'b0,data_received[7:1]};
   2'b10: wire_data_out <= {2'b0,data_received[7:2]};
   2'b11: wire_data_out <= {3'b0,data_received[7:3]};
   endcase

最终结果会是完全相同的逻辑,但可读性更好。