risc-v中文社区

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

[原创] chisel中使用参数配置的方式(1)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-9-1 11:46:02 | 显示全部楼层 |阅读模式
1)简单参数
2)使用类型参数的函数
3)具有类型参数的模块
4)参数化的捆束
5)site-here-up高级参数化机制
这几种方式或机制,分别介绍,本帖介绍第一种 简单参数:
import chisel3._
class ParamAdder(n:Int) extends Module {
  val io = IO(new Bundle {
    val a = Input(UInt(n.W))
    val b = Input(UInt(n.W))
    val c = Output(UInt(n.W))
  })
  io.c := io.a + io.b
}
class TestParamAdderModule extends Module {
  val io = IO(new Bundle {
    val a8 = Input(UInt(8.W))
    val b8 = Input(UInt(8.W))
    val out8 = Output(UInt(8.W))
    val a16 = Input(UInt(16.W))
    val b16 = Input(UInt(16.W))
    val out16 = Output(UInt(16.W))
  })
  val add8 = Module(new ParamAdder(8)) //不能直接new模块,只能用object的apply产生模块(因为有些chisel内部状态需要处理)
  val add16 = Module(new ParamAdder(16))

  add8.io.a := io.a8
  add8.io.b := io.b8
  io.out8 := add8.io.c
  add16.io.a := io.a16
  add16.io.b := io.b16
  io.out16 := add16.io.c

}

回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-9-1 11:47:48 | 显示全部楼层
简单参数,主要是通过模块的主构造参数传递值,所以很简单。

生成的verilog文件内容如下:
module ParamAdder(
  input  [7:0] io_a,
  input  [7:0] io_b,
  output [7:0] io_c
);
  assign io_c = io_a + io_b; // @[ParamAdder.scala 10:8]
endmodule
module ParamAdder_1(
  input  [15:0] io_a,
  input  [15:0] io_b,
  output [15:0] io_c
);
  assign io_c = io_a + io_b; // @[ParamAdder.scala 10:8]
endmodule
module TestParamAdderModule(
  input         clock,
  input         reset,
  input  [7:0]  io_a8,
  input  [7:0]  io_b8,
  output [7:0]  io_out8,
  input  [15:0] io_a16,
  input  [15:0] io_b16,
  output [15:0] io_out16
);
  wire [7:0] add8_io_a; // @[ParamAdder.scala 21:20]
  wire [7:0] add8_io_b; // @[ParamAdder.scala 21:20]
  wire [7:0] add8_io_c; // @[ParamAdder.scala 21:20]
  wire [15:0] add16_io_a; // @[ParamAdder.scala 22:21]
  wire [15:0] add16_io_b; // @[ParamAdder.scala 22:21]
  wire [15:0] add16_io_c; // @[ParamAdder.scala 22:21]
  ParamAdder add8 ( // @[ParamAdder.scala 21:20]
    .io_a(add8_io_a),
    .io_b(add8_io_b),
    .io_c(add8_io_c)
  );
  ParamAdder_1 add16 ( // @[ParamAdder.scala 22:21]
    .io_a(add16_io_a),
    .io_b(add16_io_b),
    .io_c(add16_io_c)
  );
  assign io_out8 = add8_io_c; // @[ParamAdder.scala 26:11]
  assign io_out16 = add16_io_c; // @[ParamAdder.scala 29:12]
  assign add8_io_a = io_a8; // @[ParamAdder.scala 24:13]
  assign add8_io_b = io_b8; // @[ParamAdder.scala 25:13]
  assign add16_io_a = io_a16; // @[ParamAdder.scala 27:14]
  assign add16_io_b = io_b16; // @[ParamAdder.scala 28:14]
endmodule
回复

使用道具 举报

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

本版积分规则



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

GMT+8, 2024-4-29 14:25 , Processed in 0.095762 second(s), 17 queries .

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

Copyright © 2018-2021, risc-v open source

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