首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用Chisel3.util内置的shiftRegister?

如何正确使用Chisel3.util内置的shiftRegister?
EN

Stack Overflow用户
提问于 2020-04-29 13:27:28
回答 1查看 474关注 0票数 2

我试着将这个内置的shiftRegister与chisel教程中的一些常见移位寄存器进行比较。但这似乎并不是真正的移位?https://github.com/freechipsproject/chisel3/blob/9f620e06bacc2882068adfd4972ec2e9a87ea723/src/main/scala/chisel3/util/Reg.scala#L33

代码语言:javascript
复制
class MyShiftRegister_chisel[T <: Data](val init: Int = 1) extends Module {
  val io = IO(new Bundle {
    val in  = Input(Bool())
    val out = Output(UInt(4.W))
  })

  val state = ShiftRegister(io.in, 1, true.B)
//     val next_state = RegNext(UInt(4.W), state)
//      val nextState = Cat(state(2,0), io.in)
//   state := nextState
  io.out := state
}
println(getVerilog(new MyShiftRegister_chisel()))

我得到了下面的verilog:

代码语言:javascript
复制
[info] [0.000] Elaborating design...
[info] [0.070] Done elaborating.
Total FIRRTL Compile Time: 28.7 ms
module MyShiftRegister_chisel(
  input        clock,
  input        reset,
  input        io_in,
  output [3:0] io_out
);
  reg  state; // @[Reg.scala 15:16]
  reg [31:0] _RAND_0;
  assign io_out = {{3'd0}, state}; // @[cmd94.sc 11: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
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}};
  state = _RAND_0[0:0];
  `endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end
  always @(posedge clock) begin
    state <= io_in;
  end
endmodule

所以我的问题是,如何正确使用来自Chisel3.util的内置shiftRegister?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-30 01:58:34

从你的ScalaDoc评论链接:

代码语言:javascript
复制
  /** Returns the n-cycle delayed version of the input signal.
    *
    * @param in input to delay
    * @param n number of cycles to delay
    * @param en enable the shift
    *
    * @example {{{
    * val regDelayTwo = ShiftRegister(nextVal, 2, ena)
    * }}}
    */
  def apply[T <: Data](in: T, n: Int, en: Bool = true.B): T = { ...

ShiftRegister延迟输入数据inn周期。对于要移入和移出的类型,它是通用的。我怀疑您指的是典型的移位寄存器,它在每个周期内移入和移出1位数据。通过将输入类型设置为Bool,您可以很容易地使用此构造完成此操作

代码语言:javascript
复制
class Foo extends Module {
  val io = IO(new Bundle {
    val in = Input(Bool())
    val out = Output(Bool())
  })

  io.out := ShiftRegister(io.in, 4)
}

给出

代码语言:javascript
复制
module Foo(
  input   clock,
  input   reset,
  input   io_in,
  output  io_out
);
  reg  _T; // @[Reg.scala 15:16]
  reg [31:0] _RAND_0;
  reg  _T_1; // @[Reg.scala 15:16]
  reg [31:0] _RAND_1;
  reg  _T_2; // @[Reg.scala 15:16]
  reg [31:0] _RAND_2;
  reg  _T_3; // @[Reg.scala 15:16]
  reg [31:0] _RAND_3;
  assign io_out = _T_3; // @[main.scala 13:10]
// ...
  always @(posedge clock) begin
    _T <= io_in;
    _T_1 <= _T;
    _T_2 <= _T_1;
    _T_3 <= _T_2;
  end
endmodule

请注意,该构造对您隐藏了底层flop,它返回最后一个flop的输出,即每个周期的“移出值”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61494871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档