第二十一章 Chisel基础——黑盒

本文详细介绍了如何在Chisel中使用BlackBox功能,以便将Verilog模块整合进Chisel代码中。内容包括:例化黑盒、复制Verilog文件、内联Verilog文件以及如何处理inout端口。BlackBox使得Chisel能够引用外部Verilog设计,扩展其功能,特别是在Chisel目前不支持的功能上。此外,还提到了在不同场景下选择不同方式导入Verilog代码的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为Chisel的功能相对Verilog来说还不完善,所以设计人员在当前版本下无法实现的功能,就需要用Verilog来实现。在这种情况下,可以使用Chisel的BlackBox功能,它的作用就是向Chisel代码提供了用Verilog设计的电路的接口,使得Chisel层面的代码可以通过模块的端口来进行交互。

一、例化黑盒

如果读者尝试在Chisel的模块里例化另一个模块,然后生成Verilog代码,就会发现端口名字里多了“io_”这样的字眼。很显然,这是因为Chisel要求模块的端口都是由字段“io”来引用的,语法分析脚本在生成Verilog代码时会保留这个端口名前缀。

假设有一个外部的Verilog模块,它的端口列表声明如下:

module Dut ( input [31: 0] a, input clk, input reset, output [3: 0] b );

按照Verilog的语法,它的例化代码应该是这样的:

Dut u0 ( .a(u0_a), .clk(u0_clk), .reset(u0_reset), .b(u0_b) ); 

其中,例化时的名字和连接的线网名是可以任意的,但是模块名“Dut”和端口名“.a”、“.clk”、“.reset”、 “.b”是固定的。

倘若把这个Verilog模块声明成普通的Chisel模块,然后直接例化使用,那么例化的Verilog代码就会变成:

Dut u0 ( .io_a(io_u0_a), .io_clk(io_u0_clk), .io_reset(io_u0_reset), .io_b(io_u0_b) );

也就是说,本来应该是“.a”,变成了“.io_a”。当然,这样做首先在Chisel层面上就不会成功,因为Chisel的编译器不允许模块内部连线为空,不能只有端口声明而没有内部连线的模块。

如果定义Dut类时,不是继承自Module,而是继承自BlackBox,则允许只有端口定义,也只需要端口定义。此外,在别的模块里例化黑盒时,编译器不会给黑盒的端口名加上“io_”,连接的线网名变成引用黑盒的变量名与黑盒端口名的组合。例如: 

// blackbox.scala
package test

import chisel3._

class Dut extends BlackBox {
  val io = IO(new Bundle {
    val a = Input(UInt(32.W))
    val clk = Input(Clock())
    val reset = Input(Bool())
    val b = Output(UInt(4.W))  
  })
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值