今天尝试一下函数和参数。
找一个合适的例子。
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))
}
下面这个实验的代码比较简单就不上传文件了。