chisel - 如何用chisel3生成像“reg [n-1:0] = 90”这样的verilog代码?
问题描述
我使用凿子进行 FPGA 开发,因为 Vivado "reg[n-1:0] = 90" 是有效的。很多模块没有复位输入,所以我不能使用 RegInit。我在谷歌凿子用户论坛上看到了同样的问题,但没有回复。
解决方案
重置在 Chisel 中是隐含的Module
,所有Reg
都会有一个重置。然后初始值将在以下代码重置时设置
val myreg = RegInit(90.U((n-1).W))
但是,对于没有复位输入的 FPGA,我们可以使用带有 Verilog“内联”的 BlackBox 生成它,如下所示:
class ResetGen extends BlackBox with HasBlackBoxInline {
val io = IO(new Bundle {
val clk = Input(Clock())
val rst = Output(Bool())
})
setInline("ResetGen.v",
s"""
|module ResetGen(
| input clk,
| output rst
|);
|
|reg reset_reg = 0;
|reg [7:0] reset_dly_cnt = 0;
|always@(posedge clk) begin
| if(reset_dly_cnt < 8'hff)
| reset_dly_cnt <= reset_dly_cnt + 1'b1;
| else
| reset_reg <= 1;
|end
|
|assign rst = !reset_reg;
|endmodule
""".stripMargin)
}
然后在您的 Top 中添加连接:
class TopMyModule extends RawModule {
val gclk = IO(Input(Clock()))
//...
/* Generate the reset pulse */
val rst = Wire(Bool())
val rstgen = Module(new ResetGen())
rstgen.io.clk := gclk
rst := rstgen.io.rst
/* Wrap all in gclk, rst domain */
withClockAndReset(gclk, rst) {
val myreg = RegInit(90.U((n-1).W))
//..
myreg
rst
当信号为 1时将初始化为 90 。
推荐阅读
- javascript - Javascript 语法问题 - 符合 ` 行但没有 ',为什么?
- java - 如何使用 Spring MVC 构建一个简单的计数器
- android - REST API 的推荐 Observable 类型
- python - 找不到满足我自己模块要求的版本
- javascript - 如何在 Angular 中切换卡片页脚
- angular - 如何制作分组标签
在角材料中向下滚动时粘在顶部 - c# - 以 JSON 格式返回对象时缺少值
- android - setOnApplyWindowInsetsListener 从未调用过
- android - 谷歌播放中 Flashalerts 应用程序的 RECEIVE_SMS 权限被禁止
- sql - 按日期按组对列值求和