risc-v中文社区

 找回密码
 立即注册
查看: 1240|回复: 2

[原创] 寄存器组装载和移位

  [复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-9-22 10:45:00 | 显示全部楼层 |阅读模式
import chisel3._
class VecShiftRegister extends Module{
  val io = IO(new Bundle {
    val ins = Input(Vec(4,UInt(4.W))) //4个元素的Vec
    val load = Input(Bool()) //装载
    val shift = Input(Bool())//移位
    val out = Output(UInt(4.W))
  })
  val delays = Reg(Vec(4,UInt())) //对应4个元素的Vec
//  val w = WireDefault(UInt())
  when(io.load) { //load时,delyas的4个元素对应接收ins的4个元素 可不可以用delays <> io.ins 效果一样
//    delays(0) := io.ins(0)
//    delays(1) := io.ins(1)
//    delays(2) := io.ins(2)
//    delays(3) := io.ins(3)
    delays <> io.ins
  }.elsewhen(io.shift) { //shift时进行移位操作
    delays(0) := io.ins(0)
    delays(1) := delays(0)
    delays(2) := delays(1)
    delays(3) := delays(2)
  }
  io.out := delays(3) //当shift时,每4个时钟就会出现一次完整移位结果值(io.ins(0))
}
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-9-22 10:48:03 | 显示全部楼层
寄存器装载和移位一般用object ShiftRegister的def apply方法,上面寄存器组的装载和移位则与之不同。其实如果深入观察chisel的源码可以看到代码的逻辑基本上是一样的。
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-9-22 10:48:42 | 显示全部楼层
产生的verilog代码内容如下:
module VecShiftRegister(
  input        clock,
  input        reset,
  input  [3:0] io_ins_0,
  input  [3:0] io_ins_1,
  input  [3:0] io_ins_2,
  input  [3:0] io_ins_3,
  input        io_load,
  input        io_shift,
  output [3:0] io_out
);
  reg [3:0] delays_0; // @[VecShiftRegister.scala 11:19]
  reg [31:0] _RAND_0;
  reg [3:0] delays_1; // @[VecShiftRegister.scala 11:19]
  reg [31:0] _RAND_1;
  reg [3:0] delays_2; // @[VecShiftRegister.scala 11:19]
  reg [31:0] _RAND_2;
  reg [3:0] delays_3; // @[VecShiftRegister.scala 11:19]
  reg [31:0] _RAND_3;
  assign io_out = delays_3; // @[VecShiftRegister.scala 25:10]
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
  integer initvar;
`endif
`ifndef SYNTHESIS
initial begin
  `ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
        #`RANDOMIZE_DELAY begin end
      `else
        #0.002 begin end
      `endif
    `endif
  `ifdef RANDOMIZE_REG_INIT
  _RAND_0 = {1{`RANDOM}};
  delays_0 = _RAND_0[3:0];
  `endif // RANDOMIZE_REG_INIT
  `ifdef RANDOMIZE_REG_INIT
  _RAND_1 = {1{`RANDOM}};
  delays_1 = _RAND_1[3:0];
  `endif // RANDOMIZE_REG_INIT
  `ifdef RANDOMIZE_REG_INIT
  _RAND_2 = {1{`RANDOM}};
  delays_2 = _RAND_2[3:0];
  `endif // RANDOMIZE_REG_INIT
  `ifdef RANDOMIZE_REG_INIT
  _RAND_3 = {1{`RANDOM}};
  delays_3 = _RAND_3[3:0];
  `endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`endif // SYNTHESIS
  always @(posedge clock) begin
    if (io_load) begin
      delays_0 <= io_ins_0;
    end else if (io_shift) begin
      delays_0 <= io_ins_0;
    end
    if (io_load) begin
      delays_1 <= io_ins_1;
    end else if (io_shift) begin
      delays_1 <= delays_0;
    end
    if (io_load) begin
      delays_2 <= io_ins_2;
    end else if (io_shift) begin
      delays_2 <= delays_1;
    end
    if (io_load) begin
      delays_3 <= io_ins_3;
    end else if (io_shift) begin
      delays_3 <= delays_2;
    end
  end
endmodule
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-5 15:23 , Processed in 0.016083 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表