risc-v中文社区

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

[经验] 0.U和0.U.asTypeOf(that)

  [复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-9-29 10:37:41 | 显示全部楼层 |阅读模式
关于这二者有什么不同,先做个实验再说:
/**
  * @Author Joe_Liang
  * @Date 2021/9/29 8:57
  * @Version 1.0
  */
import chisel3._
import chisel3.util._
class PortIO(val n:Int) extends Bundle {
  val in = DeqIO(UInt(8.W))
  val outs = Vec(n,EnqIO(UInt(8.W)))
}
class MultiOuts extends  Module{
  val io = IO(new PortIO(4))
  val cnt = RegInit(0.U(8.W))
  cnt := cnt + 1.U
  for(out <- io.outs) {
//    out.bits := 0.U //0.U和o.U.asTypeOf(out.bits)有什么不同?实验发现两次verilog逻辑代码一样,只是变量名不一样而已
    out.bits := 0.U.asTypeOf(out.bits) //asTypeOf(that)的参数that的宽度必须要已知,而0.U则可以通过推论而知
    out.noenq() //初始化的时候,一定不要忘记对DecoupledIO对象使用nodeq()或noenq()
  }
  io.in.nodeq() //初始化 //如果不初始化 查verilog中的区别
  switch(cnt) {
    is(4.U) { //所有输出在输入基础上加1
      for(out <- io.outs) {
        when(out.ready) {
          out.enq(io.in.bits + 1.U)
        }
      }
    }
    is(8.U) {//所有输出在输入基础上加2
      for(out <- io.outs) {
        when(out.ready) {
          out.enq(io.in.bits + 2.U)
        }
      }
    }
  }
}



回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-9-29 10:39:05 | 显示全部楼层
两者生成的verilog逻辑代码都一样,只是变量名不同而已,因为是个简单逻辑代码,我copy了一个的verilog代码如下:
module MultiOuts(
  input        clock,
  input        reset,
  output       io_in_ready,
  input        io_in_valid,
  input  [7:0] io_in_bits,
  input        io_outs_0_ready,
  output       io_outs_0_valid,
  output [7:0] io_outs_0_bits,
  input        io_outs_1_ready,
  output       io_outs_1_valid,
  output [7:0] io_outs_1_bits,
  input        io_outs_2_ready,
  output       io_outs_2_valid,
  output [7:0] io_outs_2_bits,
  input        io_outs_3_ready,
  output       io_outs_3_valid,
  output [7:0] io_outs_3_bits
);
  reg [7:0] cnt; // @[MultiOuts.scala 17:20]
  reg [31:0] _RAND_0;
  wire [7:0] _T_1 = cnt + 8'h1; // @[MultiOuts.scala 18:14]
  wire  _T_6 = 8'h4 == cnt; // @[Conditional.scala 37:30]
  wire [7:0] _T_8 = io_in_bits + 8'h1; // @[MultiOuts.scala 32:30]
  wire  _T_15 = 8'h8 == cnt; // @[Conditional.scala 37:30]
  wire [7:0] _T_17 = io_in_bits + 8'h2; // @[MultiOuts.scala 39:30]
  wire  _GEN_12 = _T_15 & io_outs_0_ready; // @[Conditional.scala 39:67]
  wire  _GEN_14 = _T_15 & io_outs_1_ready; // @[Conditional.scala 39:67]
  wire  _GEN_16 = _T_15 & io_outs_2_ready; // @[Conditional.scala 39:67]
  wire  _GEN_18 = _T_15 & io_outs_3_ready; // @[Conditional.scala 39:67]
  assign io_in_ready = 1'h0; // @[Decoupled.scala 72:20]
  assign io_outs_0_valid = _T_6 ? io_outs_0_ready : _GEN_12; // @[Decoupled.scala 56:20 Decoupled.scala 47:20 Decoupled.scala 47:20]
  assign io_outs_0_bits = _T_6 ? _T_8 : _T_17; // @[MultiOuts.scala 24:14 Decoupled.scala 48:19 Decoupled.scala 48:19]
  assign io_outs_1_valid = _T_6 ? io_outs_1_ready : _GEN_14; // @[Decoupled.scala 56:20 Decoupled.scala 47:20 Decoupled.scala 47:20]
  assign io_outs_1_bits = _T_6 ? _T_8 : _T_17; // @[MultiOuts.scala 24:14 Decoupled.scala 48:19 Decoupled.scala 48:19]
  assign io_outs_2_valid = _T_6 ? io_outs_2_ready : _GEN_16; // @[Decoupled.scala 56:20 Decoupled.scala 47:20 Decoupled.scala 47:20]
  assign io_outs_2_bits = _T_6 ? _T_8 : _T_17; // @[MultiOuts.scala 24:14 Decoupled.scala 48:19 Decoupled.scala 48:19]
  assign io_outs_3_valid = _T_6 ? io_outs_3_ready : _GEN_18; // @[Decoupled.scala 56:20 Decoupled.scala 47:20 Decoupled.scala 47:20]
  assign io_outs_3_bits = _T_6 ? _T_8 : _T_17; // @[MultiOuts.scala 24:14 Decoupled.scala 48:19 Decoupled.scala 48:19]
`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}};
  cnt = _RAND_0[7:0];
  `endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`endif // SYNTHESIS
  always @(posedge clock) begin
    if (reset) begin
      cnt <= 8'h0;
    end else begin
      cnt <= _T_1;
    end
  end
endmodule
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-9-29 10:40:03 | 显示全部楼层
总结:asTypeOf(that)的参数that的宽度必须要已知,而0.U则可以通过推论而知
回复

使用道具 举报

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

本版积分规则



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

GMT+8, 2024-5-5 12:41 , Processed in 0.014682 second(s), 17 queries .

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

Copyright © 2018-2021, risc-v open source

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