Scala 使用不同类型覆盖val-凿子

Scala 使用不同类型覆盖val-凿子,scala,variable-assignment,chisel,Scala,Variable Assignment,Chisel,我想使用变量cache连接到另一个名为NewCache的类,该类使用cache类的扩展IO包。但我得到了以下错误: [error]overriding lazy value cache in class Processor of type Mem.Cache; [error]lazy value cache has incompatible type. [error]override lazy val cache = Module(new NewCache(conf)) 我假设我得到这

我想使用变量
cache
连接到另一个名为
NewCache
的类,该类使用
cache
类的扩展IO包。但我得到了以下错误:

[error]overriding lazy value cache in class Processor of type Mem.Cache;  
[error]lazy value cache has incompatible type.  
[error]override lazy val cache = Module(new NewCache(conf))
我假设我得到这个错误是因为它只能将NewProcessor类中的值缓存重写为类型缓存。因此,当我使用类
NewProcessor
时,我想知道是否有任何可能的方法可以完全重新分配
cache

class Processor(inputid: Int){
    val conf = new Conf(inputid)
    lazy val cache = Module(new Cache(conf))

    cache.io.cache_req <> io.cache.req
}

class NewProcessor(inputid: Int) extends Processor(inputid){
    override lazy val cache = Module(new NewCache(conf))

    cache.io.tag_cache_req <> io.tag_cache.req
}
类处理器(inputid:Int){ val conf=新conf(inputid) 延迟val缓存=模块(新缓存(配置)) cache.io.cache_req io.cache.req } 类NewProcessor(inputid:Int)扩展了处理器(inputid){ 覆盖延迟val缓存=模块(新建缓存(配置)) cache.io.tag\u cache\u req io.tag\u cache.req }
您是否尝试过创建
新缓存
扩展
缓存
?@jkoenig是的,我尝试过。问题是,
NewProcessor
的大部分代码与
Processor
有很大不同。然而,这两个类中的许多变量名是匹配的,因此相互冲突。因此,在我看来,理想的解决方案是如果有其他方法,就不要扩展
缓存。否则,我想唯一的选择是在<代码>处理器< /C>中使用<代码>懒惰>代码>变量,然后在 NeXPrime< /C> >中重写这些变量,因此,如果<代码> NeXPuxor <代码>与处理器< /代码>完全不同,那么看来您也应该考虑不使用继承。继承只对非常相似并且可以在相似的上下文中使用的事物才有意义。虽然这更像是一个一般的软件工程问题,但对于凿子设计,我发现直接模块继承通常不是正确的方法。组合在大多数情况下都能很好地工作(特别是在实现显著不同的情况下)。继承适用于具有公共接口的模块。@jkoenig是的,听起来组合是正确的解决方案。关于如何在凿子设计中做到这一点的任何指南?其原理与任何编程语言中的原理相同。您希望将公共代码考虑到或中。如果您想要一个自定义的数据类型和方法来生成硬件,那么类是很好的。如果您希望它们映射到Verilog模块,这对调试很有用,那么它们也很有用。您是否尝试过制作
NewCache
extend
Cache
?@jkoenig是的,我尝试过。问题是,
NewProcessor
的大部分代码与
Processor
有很大不同。然而,这两个类中的许多变量名是匹配的,因此相互冲突。因此,在我看来,理想的解决方案是如果有其他方法,就不要扩展
缓存。否则,我想唯一的选择是在<代码>处理器< /C>中使用<代码>懒惰>代码>变量,然后在 NeXPrime< /C> >中重写这些变量,因此,如果<代码> NeXPuxor <代码>与处理器< /代码>完全不同,那么看来您也应该考虑不使用继承。继承只对非常相似并且可以在相似的上下文中使用的事物才有意义。虽然这更像是一个一般的软件工程问题,但对于凿子设计,我发现直接模块继承通常不是正确的方法。组合在大多数情况下都能很好地工作(特别是在实现显著不同的情况下)。继承适用于具有公共接口的模块。@jkoenig是的,听起来组合是正确的解决方案。关于如何在凿子设计中做到这一点的任何指南?其原理与任何编程语言中的原理相同。您希望将公共代码考虑到或中。如果您想要一个自定义的数据类型和方法来生成硬件,那么类是很好的。如果您希望将它们映射到Verilog模块(这对调试很有用),则这些函数也很有用。