首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >凿/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
运行
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
运行
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
运行
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
运行
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
运行
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

复制
相关文章
URL编码和Base64编码
在理清字符集和字符编码关系一文中我们介绍了常见字符集以及字符编码之间的关系,本期我们继续朝着这个方向介绍常见的编码算法。 URL编码 URL编码是浏览器发送数据给服务器时使用的编码,它是编码算法,而不
木可大大
2018/07/25
3.4K0
URL编码和Base64编码
URL安全的Base64编码
Base64编码可用于在HTTP环境下传递较长的标识信息。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。 然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的「/」和「+」字符变为形如「%XX」的形式,而这些「%」号在存入数据库时还需要再进行转换,因为ANSI SQL中已将「%」号用作通配符。 为解决此问题,可采用一种用于
张善友
2018/01/22
7.1K1
【翻译】图像到Base64字符串转换
在这个简短的教程中,我们将介绍如何使用 Apache Common IO 包和 Java 8 原生类 Base64 将图片文件转成 base64 字符串,然后把 base64 字符串再转成图片。
伍六七AI编程
2023/01/10
7760
PIXI输出base64图像
如果想使用 canvas 原生的 toDataURL ,参考这篇问答,以下代码是具体方法。但这个方法如果在iOS设备上使用,获取到的图像会上下翻转(效果相当于css3的transform: scaleY(-1);)。原因不明,可能也是webGL搞鬼吧。
黒之染
2018/10/19
1.6K0
Base64和URL编解码操作
在下载文件的时候有时候文件名称中含有中文名,下载下来后会乱码,所以就对文件名称进行一些编解码操作,来解决乱码。 BASE64编解码(解决火狐浏览器乱码): new BASE64Encoder().encode(需要编码的字节数组) —> 编码 new BASE64Decoder().decodeBuffer(解码内容) —> 解码 URL编解码: URLEncoder.encode(需要编码的内容, “UTF-8”); —> 编码 URLDecoder.decode(需要解码的内容,“UTF
阿年、嗯啊
2021/04/27
1.8K0
Java 图片URL转Base64编码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/05
3.8K0
Java 图片URL转Base64编码
js 根据url 转换图片(base64)
function getBase64(url, callback) { var Img = new Image(), dataURL = ''; Img.src = url + '?v
我乃小神神
2020/04/16
15.5K2
php使用Base64加密解密URL地址教程
要知道Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,看好是编码,并不是加密。
李洋博客
2021/06/15
2.5K0
php使用Base64加密解密URL地址教程
Base64码常见操作(url链接文件转base64编码、本地文件转base64编码等)
因为是图片,可以复制输出的base64编码到这个网址验证:https://tool.jisuapi.com/base642pic.html 其他base64操作如下:
共饮一杯无
2022/11/28
2.3K0
Python:base64图像数据处理
一、介绍 data URI scheme 是一种网页优化的手段。直接把图像的内容崁入网页里面,减少页面的请求。 浏览器并不会缓存这样的图片。 data URI scheme 虽然节省 HTTP 请求,但是如果这个图像要在网页多个地方显示的话,便会加大网页的内 容,延长了下载的时间。 其中一个解决办法是在一个 CSS class 中加入 data URL,在需要显示图像的区块调用这个 class。 二、解决方法 Python 代码实现:src转化为图片。 import base64
新码农
2020/04/16
9110
Go实战 | url和base64编码原理及应用
大家好,我是渔夫子。今天跟大家聊聊在实际工作中遇到的对密文进行base64编码和url转义的一个案例。
Go学堂
2023/01/31
1.1K0
Groovy Base64 URL和文件名安全编码
Groovy支持Base64编码很长一段时间。 从Groovy 2.5.0开始,我们还可以使用Base64 URL和Filename Safe编码来使用encodeBase64Url方法对字节数组进行编码。 结果是一个Writable对象。 我们可以在Writable对象上调用toString方法来获得String值。 可以使用添加到String类的decodeBase64Url方法使用相同的编码对编码的String值进行解码。
白石
2019/08/22
1.3K0
vue网络图片url转Base64「建议收藏」
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
4.1K0
通过指定的URL获取返回图片的BASE64编码
之前本来都是通过URL直接显示图片的,后来需求变更前端需要图片的base64,但是现在数据库只有URL,写了个方法通过URL获取图片的BASE64
彼岸舞
2021/05/18
3K0
输入URL到页面加载
https://juejin.im/entry/58ce00c5ac502e00589b4bde
tanoak
2018/10/10
1K0
输入URL到页面加载
(1)当你输入URL到页面显示经历了什么--URL到IP地址
这是一个经典的问题,能区分知识的广度与深度,从回答的侧重点上甚至能区分出工种(前端、后端、运维等)。开发人员基本上都能说出几点,而牛人更可在自己擅长的地方发挥到淋漓尽致。 由于知识有限,我只从下面四点
前端黑板报
2018/01/29
1.1K0
(1)当你输入URL到页面显示经历了什么--URL到IP地址
Groovy中 Base64 URL和文件名安全编码
Groovy支持Base64编码很长一段时间。 从Groovy 2.5.0开始,我们还可以使用Base64 URL和Filename Safe编码来使用encodeBase64Url方法对字节数组进行编码。 结果是一个Writable对象。 我们可以在Writable对象上调用toString方法来获得String值。 可以使用添加到String类的decodeBase64Url方法使用相同的编码对编码的String值进行解码。
白石
2019/08/23
1.3K0
StarGAN - 图像到图像的翻译
通过输入来自两个不同领域的训练数据,StarGANs模型可以学习将某一个领域的图片转换成为另一个领域。
AI研习社
2019/05/08
8640
StarGAN - 图像到图像的翻译
java url抓取文件到本地
package socket; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.ut
葫芦
2019/05/09
1.6K0
Python实现图像与Base64格式互转
众所周知,Python是实现图像处理的首选编程语言,实际项目开发过程中,难免遇到图像格式的转换。以下简单记录下基于Python实现图像与Base64的互转。
软件架构师Michael
2023/04/18
1.2K0

相似问题

Rails到Base64的外部图像Url

21

画布到图像base64编码的url没有显示图像

10

图像到base64

11

图像从Base64到图像

22

Base64到图像?JAVA

110
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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