risc-v中文社区

 找回密码
 立即注册
查看: 1056|回复: 1

[原创] 参数化的寄存器组装载和移位

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-9-22 11:05:47 | 显示全部楼层 |阅读模式
上一帖中介绍了寄存器组装载和移位,但一般情况下需要的是参数化的寄存器组移位,所以本实验介绍如何参数化:
import chisel3._

/**
  * 参数化的寄存器组装载和移位
  * @param n 待移位次数
  * @param w 每个寄存器位宽
  */
class VecShiftRegisterParam (val n:Int,val w:Int)extends Module{
  val io = IO(new Bundle {
    val in = Input(UInt(w.W))
    val out = Output(UInt(w.W))
  })
  val initValues = Array.fill(n)(0.U(w.W)) //{0.U(w.W)} 集合中每个元素赋硬件初值0.U(w.W)
  val delays = RegInit(VecInit(initValues))
  for(i <- n-1 to 1 by -1) {
    delays(i) := delays(i-1) //小序号元素值赋给后一个元素
  }
  delays(0) := io.in //集合的第一个元素值
  io.out := delays(n-1) //输出取集合中最后一个元素的值
}
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-9-22 11:10:13 | 显示全部楼层
Driver.execute(Array("--target-dir","generated"),()=>new VecShiftRegisterParam(4,3))产生的verilog内容如下:
module VecShiftRegisterParam(
  input        clock,
  input        reset,
  input  [2:0] io_in,
  output [2:0] io_out
);
  reg [2:0] delays_0; // @[VecShiftRegisterParam.scala 16:23]
  reg [31:0] _RAND_0;
  reg [2:0] delays_1; // @[VecShiftRegisterParam.scala 16:23]
  reg [31:0] _RAND_1;
  reg [2:0] delays_2; // @[VecShiftRegisterParam.scala 16:23]
  reg [31:0] _RAND_2;
  reg [2:0] delays_3; // @[VecShiftRegisterParam.scala 16:23]
  reg [31:0] _RAND_3;
  assign io_out = delays_3; // @[VecShiftRegisterParam.scala 21: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[2:0];
  `endif // RANDOMIZE_REG_INIT
  `ifdef RANDOMIZE_REG_INIT
  _RAND_1 = {1{`RANDOM}};
  delays_1 = _RAND_1[2:0];
  `endif // RANDOMIZE_REG_INIT
  `ifdef RANDOMIZE_REG_INIT
  _RAND_2 = {1{`RANDOM}};
  delays_2 = _RAND_2[2:0];
  `endif // RANDOMIZE_REG_INIT
  `ifdef RANDOMIZE_REG_INIT
  _RAND_3 = {1{`RANDOM}};
  delays_3 = _RAND_3[2:0];
  `endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`endif // SYNTHESIS
  always @(posedge clock) begin
    if (reset) begin
      delays_0 <= 3'h0;
    end else begin
      delays_0 <= io_in;
    end
    if (reset) begin
      delays_1 <= 3'h0;
    end else begin
      delays_1 <= delays_0;
    end
    if (reset) begin
      delays_2 <= 3'h0;
    end else begin
      delays_2 <= delays_1;
    end
    if (reset) begin
      delays_3 <= 3'h0;
    end else begin
      delays_3 <= delays_2;
    end
  end
endmodule
回复

使用道具 举报

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

本版积分规则



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

GMT+8, 2024-5-5 04:55 , Processed in 0.015007 second(s), 17 queries .

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

Copyright © 2018-2021, risc-v open source

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