2013-11-16 5 views
3

С ++ для следующего фрагмента Долото синтезированного NONE:долото не синтезируют ни ни для Verilog, ни для

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) и складывают константы:

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 способов случай):

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 

Не совсем понятно, почему существуют только фиктивные конструкции Что мне делать, чтобы обеспечить синтез логики? Благодаря!

+0

Что 'log2Up' означает в Долото? – solvingPuzzles

+0

log2Up вычисляет журнал (в base2) числа и округляется вверх до ближайшего целого числа. Очень полезно для вычисления количества бит, необходимых для адреса. Log2Up является частью ChiselUtil. – Chris

ответ

3

Буровое долото будет агрессивно обрезать сигналы в вашем дизайне, если они не подключены ни к чему.

Похоже, что в вашем случае у вас нет OUTPUTS из PsuedoLRU, только входы «last_used_cline» и «update_state». Это похоже на запись функции на C/C++ и ничего не делать с результатами функции.

Теперь в C вы можете пометить переменную (ы) как «изменчивую», чтобы обмануть компилятор в поддержании вашего кода (вы обещаете, что кто-то другой будет использовать значение этой переменной). В Chisel вы можете использовать «debug()», чтобы заставить сигналы существовать.

Я считаю, чтобы заставить вашу VEC из REGS существовать, вы можете сделать это:

for (i <- 0 until num_ways) 
    debug(state(i)) 
+2

Хорошо, спасибо. Подтверждение действительно работает. –

+0

После добавления кода для виртуализации строки кэша и подключения к выходному проводу необходимость в отладочной заявке была полностью устранена. –

Смежные вопросы