Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >凿/FIRRTL DefnameDifferentPortsException

凿/FIRRTL DefnameDifferentPortsException
EN

Stack Overflow用户
提问于 2020-10-19 23:40:55
回答 1查看 140关注 0票数 3

我最近更新了我的一个大型项目的Chisel版本,从3.1.1升级到3.4.0;但是,我得到了一堆firrtl.passes.CheckHighFormLike$DefnameDifferentPortsException

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
firrtl.passes.CheckHighFormLike$DefnameDifferentPortsException: : ports of extmodule XilinxSimpleDualPortNoChangeBRAM with defname XilinxSimpleDualPortNoChangeBRAM are different for an extmodule with the same defname
firrtl.passes.CheckHighFormLike$DefnameDifferentPortsException: : ports of extmodule XilinxSimpleDualPortNoChangeBRAM_1 with defname XilinxSimpleDualPortNoChangeBRAM are different for an extmodule with the same defname
// and so on 241 times

下面是XilinxSimpleDualPortNoChangeBRAM的定义及其依赖关系:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class XilinxSimpleDualPortNoChangeBRAM(width: Int,
                                       depth: Int,
                                       performance: String="HIGH_PERFORMANCE",
                                       initFile: String="",
                                       ramStyle: String="block",
                                       val useReset: Boolean=false)
                                       extends BlackBox(Map("RAM_WIDTH" -> width,
                                                            "RAM_DEPTH" -> depth,
                                                            "RAM_PERFORMANCE" -> performance,
                                                            "INIT_FILE" -> initFile,
                                                            "RAM_STYLE" -> ramStyle))
                                       with HasBlackBoxResource with Memory {
    val io = IO(new XilinxSimpleDualPortBRAMBlackBoxIO(log2Ceil(depth), width))
    val acceptedRamStyles = Seq("block", "distributed", "registers", "ultra")
    require(acceptedRamStyles contains ramStyle)
    def write(wrAddr: UInt, wrData: UInt, wrEn: Bool): Unit = {
      io.wea := wrEn
      io.addra := wrAddr
      io.dina := wrData
    }

    def read(rdAddr: UInt, rdEn: Bool): UInt = {
      io.addrb := rdAddr
      io.regceb := rdEn
      io.enb := rdEn
      io.doutb
    }

    def defaultBindings(clock: Clock, reset: core.Reset): Unit = {
      io.clock := clock
      if(useReset)
        io.reset := reset
      else
        io.reset := false.B
    }
    setResource("/XilinxSimpleDualPortNoChangeBRAM.v")
}

trait Memory extends BaseModule {
  def read(rdAddr: UInt, rdEn: Bool): UInt
  def write(wrAddr: UInt, wrData: UInt, wrEn: Bool): Unit
  val latency: Int = 2
}

class XilinxSimpleDualPortBRAMIO(addrWidth: Int, dataWidth: Int) extends Bundle {
    val addra  = Input(UInt(addrWidth.W))
    val addrb  = Input(UInt(addrWidth.W))
    val dina   = Input(UInt(dataWidth.W))
    val wea    = Input(Bool())
    val enb    = Input(Bool())
    val regceb = Input(Bool())
    val doutb  = Output(UInt(dataWidth.W))

    override def cloneType = (new XilinxSimpleDualPortBRAMIO(addrWidth, dataWidth)).asInstanceOf[this.type]
}
class XilinxSimpleDualPortBRAMBlackBoxIO(addrWidth: Int, dataWidth: Int) extends XilinxSimpleDualPortBRAMIO(addrWidth, dataWidth) {
    val clock  = Input(Clock())
    val reset  = Input(Reset())

    override def cloneType = (new XilinxSimpleDualPortBRAMBlackBoxIO(addrWidth, dataWidth)).asInstanceOf[this.type]
}

Verilog资源XilinxSimpleDualPortNoChangeBRAM.v是Vivado中可用的BRAM实例化模板之一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module XilinxSimpleDualPortNoChangeBRAM #(
  parameter RAM_WIDTH = 64,                       // Specify RAM data width
  parameter RAM_DEPTH = 512,                      // Specify RAM depth (number of entries)
  parameter RAM_PERFORMANCE = "HIGH_PERFORMANCE", // Select "HIGH_PERFORMANCE" or "LOW_LATENCY"
  parameter INIT_FILE = "",                       // Specify name/location of RAM initialization file if using one (leave blank if not)
  parameter RAM_STYLE = "block"                   // Target memory type. Accepted values: block, distributed, registers, ultra (UltraScale+ only)
) (
  input [clogb2(RAM_DEPTH-1)-1:0] addra, // Write address bus, width determined from RAM_DEPTH
  input [clogb2(RAM_DEPTH-1)-1:0] addrb, // Read address bus, width determined from RAM_DEPTH
  input [RAM_WIDTH-1:0] dina,          // RAM input data
  input wea,                           // Write enable
  input enb,                           // Read Enable, for additional power savings, disable when not in use
  input regceb,                        // Output register enable
  output [RAM_WIDTH-1:0] doutb,         // RAM output data
  input clock,                          // Clock
  input reset                          // Output reset (does not affect memory contents)
);

  (* ram_style = RAM_STYLE *) reg [RAM_WIDTH-1:0] BRAM [RAM_DEPTH-1:0];
  reg [RAM_WIDTH-1:0] ram_data = {RAM_WIDTH{1'b0}};

  // The following code either initializes the memory values to a specified file or to all zeros to match hardware
  generate
    if (INIT_FILE != "") begin: use_init_file
      initial
        $readmemh(INIT_FILE, BRAM, 0, RAM_DEPTH-1);
    end else begin: init_bram_to_zero
      integer ram_index;
      initial
        for (ram_index = 0; ram_index < RAM_DEPTH; ram_index = ram_index + 1)
          BRAM[ram_index] = {RAM_WIDTH{1'b0}};
    end
  endgenerate

  always @(posedge clock) begin
    if (wea)
      BRAM[addra] <= dina;
    if (enb)
      ram_data <= BRAM[addrb];
  end

  //  The following code generates HIGH_PERFORMANCE (use output register) or LOW_LATENCY (no output register)
  generate
    if (RAM_PERFORMANCE == "LOW_LATENCY") begin: no_output_register

      // The following is a 1 clock cycle read latency at the cost of a longer clock-to-out timing
       assign doutb = ram_data;

    end else begin: output_register

      // The following is a 2 clock cycle read latency with improve clock-to-out timing

      reg [RAM_WIDTH-1:0] doutb_reg = {RAM_WIDTH{1'b0}};

      always @(posedge clock)
        if (reset)
          doutb_reg <= {RAM_WIDTH{1'b0}};
        else if (regceb)
          doutb_reg <= ram_data;

      assign doutb = doutb_reg;

    end
  endgenerate

  //  The following function calculates the address width based on specified RAM depth
  function integer clogb2;
    input integer depth;
      for (clogb2=0; depth>0; clogb2=clogb2+1)
        depth = depth >> 1;
  endfunction

endmodule

我试图查看抛出此异常的文件,CheckHighForm.scala,但是我很快就迷路了,因为我不知道应该寻找什么。

我从CheckSpec.scala中的测试中了解到,它应该是throw an exception if ExtModules have matching port names and widths, but a different order,所以我试图使Chisel BlackBox中的输入顺序与Verilog模块中的输入顺序相同,但我仍然得到了一个异常。

测试throw an exception if parameterless ExtModules have the same ports, but different widths使我认为具有不同端口宽度的多个实例化可能是异常的原因,但是还有另一个测试表明它应该NOT throw an exception if ExtModules have parameters, matching port names, but different widths,这是因为端口宽度是由参数控制的。

这一例外的原因是什么?

更新:根据请求,这是黑匣子的两个实例化的FIRRTL IR:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  extmodule XilinxSimpleDualPortNoChangeBRAM : 
    input addra : UInt<14>
    input addrb : UInt<14>
    input dina : UInt<1>
    input wea : UInt<1>
    input enb : UInt<1>
    input regceb : UInt<1>
    output doutb : UInt<1>
    input clock : Clock
    input reset : Reset
    
    defname = XilinxSimpleDualPortNoChangeBRAM
    parameter RAM_STYLE = "block"
    parameter RAM_WIDTH = 1
    parameter RAM_DEPTH = 16384
    parameter RAM_PERFORMANCE = "HIGH_PERFORMANCE"
    parameter INIT_FILE = ""

  extmodule XilinxSimpleDualPortNoChangeBRAM_1 : 
    input addra : UInt<6>
    input addrb : UInt<6>
    input dina : UInt<518>
    input wea : UInt<1>
    input enb : UInt<1>
    input regceb : UInt<1>
    output doutb : UInt<518>
    input clock : Clock
    input reset : Reset
    
    defname = XilinxSimpleDualPortNoChangeBRAM
    parameter RAM_STYLE = "distributed"
    parameter RAM_WIDTH = 518
    parameter RAM_DEPTH = 64
    parameter RAM_PERFORMANCE = "HIGH_PERFORMANCE"
    parameter INIT_FILE = ""

更新2:很明显,一些XilinxSimpleDualPortNoChangeBRAM正在选择一个较旧版本的XilinxSimpleDualPortBRAMBlackBoxIO,其中重置仍然是Bool类型而不是Reset类型。改变它解决了这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-20 06:29:22

当引用特定的BlackBox时,这种检查应该不允许出现不可能的情况。也就是说,以下情况必须是正确的:

如果

  • 没有参数,那么所有端口都必须具有相同的名称、相同的宽度,并且如果BlackBox有参数,则必须保持相同的
  • 顺序,那么所有端口都必须具有相同的名称和相同的顺序(但可能有不同的宽度)

听起来,您的示例要么生成违反后一个条件的BlackBoxes (因为您的BlackBoxes有参数),要么在FIRRTL编译器检查中暴露了一个错误。

实际的Verilog模块从未被检查过,在这里也不会造成任何问题。

您能否更新您的问题,以提供产生这些错误的FIRRTL IR?具体来说,用于XilinxSimpleDualPortNoChangeBRAMXilinxSimpleDualPortNoChangeBRAM_1的FIRRTL是什么样子的?这应该在像"Foo.fir“这样的文件中。或者,您也可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import chisel3.stage.ChiselStage

/* Note: this is emitChirrtl ("chirrtl") as you want the FIRRTL emitted from Chisel. */
println(ChiselStage.emitChirrtl(new MyTopModule))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64440617

复制
相关文章
力学概念|人工凿石的力学分析
金属没有广泛使用之前,古人是如何采石的呢?古人善用“借力打力”的方法,一种方法是将“木楔”放入孔洞,然后往木楔上浇水,木头遇水膨胀,这股巨大的张力可以将石头崩开。另一种方法是“火烧浇水”,即先用柴火把石头烧得灼热,然后泼几盆冷水上去,因为热胀冷缩,石头会崩裂疏松,更容易开凿。去过都江堰的都知道,李冰凿穿玉垒山采用的就是这个方法。
fem178
2023/08/23
2020
力学概念|人工凿石的力学分析
芯片开发语言:Verilog 在左,Chisel 在右
来源 | 老石谈芯 在最近召开的RISC-V中国峰会上,中科院计算所的包云岗研究员团队正式发布了名为“香山”的开源高性能处RISC-V处理器。前不久我有幸和包老师就这个事情做了一次深度的交流,我们聊了关于RISC-V、还有“香山”处理器的前世今生。包老师也分享了很多他关于开源硬件、新型开发语言、硬件敏捷设计、还有处理器基础架构等等这些问题的想法和学术思考,我深受启发。 包云岗是中科院计算技术研究所研究员、副所长,先进计算机系统研究中心主任,中国科学院大学特聘教授,中国开放指令生态(RISC-V)联盟秘书长
AI科技大本营
2023/05/08
1.8K0
芯片开发语言:Verilog 在左,Chisel 在右
AI还需要机器学习理论么?
最近,有几个朋友以不同的方式跟我表达了同一个意思:过去十年,机器学习理论没有给AI的发展带来任何帮助,它只是个理论圈自娱自乐的玩具。
算法进阶
2023/08/28
1630
AI还需要机器学习理论么?
IC数字前端开源仿真工具和LLHD
在数字电路前端设计流程中,前端仿真用于验证电路设计逻辑功能的正确性,常用的仿真软件有商业软件VCS和ModelSim(现在好像叫Questa了),国外大学里教学也常用一些开源软件,如iverilog和verilator。
hunterzju
2021/12/09
1.7K0
RDD — flatmap
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139838.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/23
3440
Vue入坑第一式 | 博客全站 Vue.js 重构
dalao 们说的好啊,新年就是要入新坑。听说 Vue.js 是国人产物,又能降低代码量,缩短开发时间,何乐而不为?
Tony He
2022/11/17
6230
Vue入坑第一式 | 博客全站 Vue.js 重构
国人当自强 | 中国古代的“机器人梦”,带你看看祖先们的机械智慧
今天,机器人可以被设计、制作,为人类服务。而在中国,古代人早就有“机器人梦”,梦想着能制作一种形态像人的物件来代替人类劳动。为这个梦想,中国人制作出了能够自己活动的机械装置,可以被视为现代机器人的鼻祖。 春秋后期,鲁班曾经制造过一只能在空中自由飞行的木鸟,“三日不下”。三国时期的蜀汉,为了运送粮食,著名军事家诸葛亮发明了木制的带有晃动货箱的人力步行式运输器具——木牛流马,虽然其样貌不明,却被称为最早的陆地军用机器人。 虽然这都是些简易的装置,可是它们也都有着自己的动力来源。据史料记载,今天可知的我国古代机器
机器人网
2018/04/23
4.1K0
国人当自强 | 中国古代的“机器人梦”,带你看看祖先们的机械智慧
力学概念| 预应力应用实例
杭州黄龙体育中心建于2000年,如图1所示。体育场直径为244 m悬挑屋盖的跨度为 50 m,为观众提供了一个无障碍的视线空间。屋盖采用双层网格结构,支承在内外环梁上。内环梁通过斜拉索悬挂在体育场两端的塔柱上。斜拉索为屋盖提供了弹性支承,降低了屋盖的内力(弯矩),屋盖的刚度随之增大。塔柱承受了斜拉索传来的巨大拉力,包括悬挑屋盖的自重和屋盖上的荷载。这些索拉力在85m高的塔上产生了巨大的弯矩,给塔柱设计带来了挑战。弯矩大,配筋过多,造成施工困难,表面也容易产生裂缝,影响混凝土耐久性。为了减小塔中的弯矩在塔柱的后部施加后张预应力以抵消索产生的弯矩作用。通过这种方式,塔柱中的弯矩变小,从而节省了材料,也增大了结构刚度。图2给出了一个塔柱的弯矩。图2a定性地给出了塔的高度、作用在塔柱上的力以及塔柱中的弯矩。最大弯矩发生在塔柱的底部,记为
fem178
2023/10/25
2580
力学概念| 预应力应用实例
[AI] John Deere发表农用AI无人牵引机
老牌农业机械制造商John Deere,在CES 2022上,发表了最新可大规模生产的无人牵引机(Tractor),该牵引机支持TruSet凿犁、GPS导引系统等先进系统,官方尚未公布价格,但提到,无人牵引机会在今年稍晚正式上市。
阿泽
2022/01/20
3330
[AI] John Deere发表农用AI无人牵引机
《人民日报》两度点赞极氪智慧工厂 广域铭岛持续智造赋能
近日,《人民日报》关注了极氪智慧工厂,介绍了其智能制造系统在品质管控和个性化定制方面的表现。这也是今年以来,《人民日报》第二次关注极氪智慧工厂。
中国新闻网
2023/05/08
1650
广域铭岛出席AEE2023汽车技术年会 分享自研工业APP应用成效及价值
2月23日,广域铭岛参加AEE2023年汽车技术年会,分享了自研工业APP在汽车整车工艺质量提升中的应用案例及成效,重点阐述了在焊点质量管理、尺寸管理、冲压排产、冲压模具管理、拧紧管理等汽车工艺场景中,工业APP给汽车制造企业带来的业务价值。
中国新闻网
2023/02/28
2900
我的世界服务器必备指令手机版_我的世界服务器传送点指令
箭非常的酷。大约五分钟,这项技能会不断增加它的伤害随着级别的升高,最后你能射晕对手,对PVP有好处。还有,箭术等级越高,你就越容易从尸体上拿回箭。
全栈程序员站长
2022/09/28
4.7K0
MarkDown 语法
标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 ## 标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 列表 1. 无序列表 无序列表(01) 继续分列表(001) 继续分列表(002) 继续分列表(003) 无序列表(02) 继续分列表(001) 继续分列表(0001) 继续分列表(0002) 继续分列表(0003) 继续分列表(002) 继续分列表(003) 2. 有序列表 有序列表(01)
用户1890628
2018/05/10
1.4K0
面试题精选:Android埋点,减少对业务代码的入侵
前几天去参加了一场面试。面试的题目大多很基础,有一道关于埋点的问题,面试官问我如果不用第三方SDK进行埋点,自己埋点的话,如何减少埋点对业务代码的入侵。
Android技术干货分享
2019/10/15
9300
面试题精选:Android埋点,减少对业务代码的入侵
分布式系统-----BASE理论
CAP理论是分布式系统的基石, 那么base理论就是分布式系统的台阶了,在基石上凿的台阶。
袁新栋-jeff.yuan
2022/05/05
3940
中国台湾“缺水危机”再现,恐将冲击晶圆代工及面板制造业
2月22日消息,据中国台湾媒体报道,台湾南部正面临30年最大枯旱,台湾自来水股份有限公司昨(21)日宣布,3月1日起台南地区的水情预警灯号调整为减量供水的“橙灯”,台南市工业区、科学园区将实施节水10%,非科学园区及工业区的每月用水量1,000度以上工业用户,同样须节水一成。这也使得晶圆代工、显示面板制造等高耗水产业拉响警报。
芯智讯
2023/03/25
2370
中国台湾“缺水危机”再现,恐将冲击晶圆代工及面板制造业
xshell隧道转发的三种类型
利用XShell隧道通过跳板机连接内网机器。跳板机公网可以访问,或者通过局域网可以访问,但内网的节点公网或局域网无法直接访问。
后端云
2019/08/29
10.2K0
xshell隧道转发的三种类型
别让接线这件小事,拉开你与工程师的差距
导线与导线的连接、线头与接线桩的连接,事情小,责任大。本文图文并茂,让你清清楚楚看懂! 导线与导线的连接 导线的连接情况有:单股铜芯导线的直线连接、T字形连接;双股线的对接;多股铜芯导线的直线连接、T
机器人网
2018/05/04
8800
别让接线这件小事,拉开你与工程师的差距
玩转 Spring Boot 应用篇(引入RabbitMQ解决店铺下单峰值问题)(十八)
上次分享通过集成 Redis 技术组件,让请求不再直接查询数据库,而是优先从 Redis 查询商品信息,进而来解决数据库高并发读的问题。
botkenni
2022/09/23
2810
玩转 Spring Boot 应用篇(引入RabbitMQ解决店铺下单峰值问题)(十八)
看不见的城市 III:智慧之城为人服务才是智慧城市的内核
在智慧城市的建设中,城市本身的复杂性不应被看作科技发展的阻碍,而是帮助科技回归人性化,回归到为人服务的初心,才是智慧城市的内核。 【编者按】城市是什么?主政者、规划者,建设者,居住者,迁徙的异乡者,游览的观光客……相信答案五花八门。无论答案是什么,有一点可以肯定,城市是承载许多人生活与梦想的所在。这里面,有快乐,有希冀,有追求,有梦想,有苦痛,有委屈,有遗憾,也许你在城市生活多年,可是你真的认识你的城市吗?或者说,你看见了城市的一部分,而城市更多的面孔是你所未曾看见的。 就像意大利作家卡尔维诺在《看不见的城
企鹅号小编
2018/01/12
7640
看不见的城市 III:智慧之城为人服务才是智慧城市的内核

相似问题

凿--时钟门控

22

凿同步

10

凿形码变换

30

必需:t凿错误

11

凿编程错误

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文