CHISEL 点滴积累 之四

今天尝试一下函数和参数。

找一个合适的例子。

 

package simple
import chisel3._

class aCounter(size: Int) extends Module { ///size 为参数
  val io = IO(new Bundle {
    val out = Output(UInt(size.W))
  })
  val r1 = RegInit(0.U(size.W))
  r1 := r1 + 1.U
  io.out := r1  
  }
  
object Counter extends App{
println("Generating the aCounter hardware ")
chisel3.Driver.execute(Array("--target-dir","generated"),()=>new aCounter(128)) 
//构造对象时候要注意将size具体赋给数值。
}


这里注意aCounter这个类就有了一个参数size,在构造对象object的时候要具体化为某一个指定的数值。

以下是生成的verilog代码。我做了各种实验希望生成的verilog代码里面带有parameter参数,结果都失败了。

module aCounter( // @[:@3.2]
  input          clock, // @[:@4.4]
  input          reset, // @[:@5.4]
  output [127:0] io_out // @[:@6.4]
);
  reg [127:0] r1; // @[Counter.scala 8:19:@8.4]
  reg [127:0] _RAND_0;
  wire [128:0] _T_10; // @[Counter.scala 9:12:@9.4]
  wire [127:0] _T_11; // @[Counter.scala 9:12:@10.4]
  assign _T_10 = r1 + 128'h1; // @[Counter.scala 9:12:@9.4]
  assign _T_11 = _T_10[127:0]; // @[Counter.scala 9:12:@10.4]
  assign io_out = r1; // @[Counter.scala 10:10:@12.4]
`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
`ifdef RANDOMIZE
  integer initvar;
  initial begin
    `ifndef verilator
      #0.002 begin end
    `endif
  `ifdef RANDOMIZE_REG_INIT
  _RAND_0 = {4{$random}};
  r1 = _RAND_0[127:0];
  `endif // RANDOMIZE_REG_INIT
  end
`endif // RANDOMIZE
  always @(posedge clock) begin
    if (reset) begin
      r1 <= 128'h0;
    end else begin
      r1 <= _T_11;
    end
  end
endmodule

链接:https://pan.baidu.com/s/1ZGwFA3odjz3_ldcB0lFoeg 
提取码:69yo  

 

 

以上实验的是参数化的实验,结论是只能用class 构造对象的时候指定参数。

下面实验一下函数def

 

 

package simple
import chisel3._

class aCounter(size: Int) extends Module {
  val io = IO(new Bundle {
    val out = Output(UInt(size.W))
  })
  def inc_1(a:UInt)=1.U + a ;  //定义了一个传递参数的函数
  def inc_b(a:UInt,b:UInt)=a + b  ; //定义了两个传递参数的函数
  val r1 = RegInit(0.U(size.W))
  //r1 := inc_1(r1)
  r1 := inc_b(r1,1.U )
  io.out := r1  
  }
  
object Counter extends App{
println("Generating the aCounter hardware ")
chisel3.Driver.execute(Array("--target-dir","generated"),()=>new aCounter(128))
}


另外我也实验了,函数定义可以写在调用的语句之前,看下面代码:

package simple
import chisel3._

class aCounter(size: Int) extends Module {
  val io = IO(new Bundle {
    val out = Output(UInt(size.W))
  })
  
  val r1 = RegInit(0.U(size.W))
  //r1 := inc_1(r1)
  r1 := inc_b(r1,1.U )
  io.out := r1  
  
  def inc_1(a:UInt)=1.U + a ;// 函数可以定义在调用之后
  def inc_b(a:UInt,b:UInt)=a + b  ;// 函数可以定义在调用之后
  
  }
  
object Counter extends App{
println("Generating the aCounter hardware ")
chisel3.Driver.execute(Array("--target-dir","generated"),()=>new aCounter(128))
}


下面这个实验的代码比较简单就不上传文件了。

 

 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值