首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >凿子既不合成verilog也不合成C++

凿子既不合成verilog也不合成C++
EN

Stack Overflow用户
提问于 2013-11-16 14:58:16
回答 1查看 319关注 0票数 3

对于以下片段,Chisel没有合成:

代码语言:javascript
复制
import Chisel._
import Node._
import scala.collection.mutable.HashMap

class PseudoLRU(val num_ways: Int) extends Module
{

    val num_levels = log2Up(num_ways)

    val io = new Bundle {
        val last_used_cline = UInt(INPUT,  width = num_levels)
        val update_state    = Bool(INPUT)
    }

    val state = Reg(Vec.fill(num_ways-1){Bool()})

    private val msb = num_levels - 1

    when (io.update_state) {

        // process level 0
        state(0) := !io.last_used_cline(msb, msb) // get the most significant bit

        // process other levels
        for (level <- 1 until num_levels) {
             val offset = UInt((1 << level) - 1, width = log2Up(num_ways-1))
             val bit_index = io.last_used_cline(msb, msb - level + 1) + offset
             val pos = msb - level
             val bit = io.last_used_cline(pos, pos)
             state(bit_index) := !bit
        }
    }
}

object test_driver {
    def main(args: Array[String]): Unit = {
        val plru_inst  = () => Module(new PseudoLRU(num_ways = 16))
        chiselMain(args, plru_inst)

    }
}

如果手动展开循环(级别<- 1直到num_levels)并折叠常量,则相同的行为:

代码语言:javascript
复制
when (io.update_state) {
    state(                                            0  ) := !io.last_used_cline(3, 3)
    state( io.last_used_cline(3, 3) + UInt(1, width = 3) ) := !io.last_used_cline(2, 2)
    state( io.last_used_cline(3, 2) + UInt(3, width = 3) ) := !io.last_used_cline(1, 1)
    state( io.last_used_cline(3, 1) + UInt(7, width = 3) ) := !io.last_used_cline(0, 0)
}

为这两个片段生成的verilog (和类似的C++代码)( 16种情况下的原始和未滚动/实例化):

代码语言:javascript
复制
module PseudoLRU(input reset,
    input [3:0] io_last_used_cline,
    input  io_update_state
);

  wire T0;
  wire[151:0] T1;

  assign T0 = ! reset;
endmodule

不太明白为什么只有虚拟结构,我该怎么做才能加强逻辑的综合?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-16 18:32:12

凿子会在你的设计中积极地修剪信号,如果它们没有连接到任何东西。

在您的示例中,您没有来自PsuedoLRU的输出,只有输入"last_used_cline“和"update_state”。这就像用C/C++编写函数,而不对函数的结果做任何事情。

现在,在C中,您可以将变量标记为“易失性”,以诱使编译器保留代码(您承诺其他人将使用该变量的值)。在Chisel中,您可以使用"debug()“强制信号存在。

我相信要强迫你的退伍军人存在,你可以这样做:

代码语言:javascript
复制
for (i <- 0 until num_ways)
    debug(state(i))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20019839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档