Пример регистра сдвига долота

Я очень новичок в scala и Chisel. Я попытался создать пример Shiftregister с динамическим размером, но я не уверен, что следующий код правильный. Было бы неплохо, если бы кто-нибудь прокомментировал:

import Chisel._

class Shiftregister(length: Int) extends Module {
    val io = new Bundle {
        val clk        = UInt(INPUT,  1)
        val load       = UInt(INPUT,  1) // 1 read from s_data_in, 0 read from p_data_in
        val s_data_in  = UInt(INPUT,  1)
        val s_data_out = UInt(OUTPUT, 1)
        val p_data_in  = UInt(INPUT,  length)
        val p_data_out = UInt(OUTPUT, length)
    }

    val bitfield = Reg(init = UInt(length))

    when (io.load.toBool()) {
        bitfield := Cat(io.s_data_in, bitfield(length, 1))
    }
    .otherwise {
        bitfield := io.p_data_in
    }
    io.p_data_out := Reg(next = bitfield)
    io.s_data_out := Reg(next = bitfield(0))
}

class ShiftregisterTest(c: Shiftregister) extends Tester(c, Array(c.io)) {
    defTests {
        true
    }
}

object Shiftregister {
    def main(args: Array[String]): Unit = {
        chiselMainTest(Array[String]("--backend", "c", "--genHarness", "--v"), () => Module(new Shiftregister(16))){c => new ShiftregisterTest(c)}
    }
}

Я попытался создать эквивалент следующего кода VHDL:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY shiftregister IS
    GENERIC(
        length: positive
    );
    PORT(
        clk: IN STD_LOGIC;
        load: IN STD_LOGIC; -- 1 read from s_data_in, 0 read from p_data_in
        s_data_in: IN STD_LOGIC := '0';
        s_data_out: OUT STD_LOGIC;
        p_data_in: IN STD_LOGIC_VECTOR(length-1 DOWNTO 0) := (others => '0');
        p_data_out: OUT STD_LOGIC_VECTOR(length-1 DOWNTO 0)
    );
END ENTITY shiftregister;

ARCHITECTURE synthesis OF shiftregister IS
    SIGNAL bitfield: STD_LOGIC_VECTOR(length-1 DOWNTO 0);
BEGIN
    PROCESS (clk) IS
    BEGIN
        IF RISING_EDGE(clk) THEN
            IF load = '0' THEN
                bitfield <= p_data_in;
            ELSE
                bitfield(length-1 DOWNTO 0) <= s_data_in & bitfield(length-1 DOWNTO 1);
            END IF;
        END IF;
    END PROCESS;
    p_data_out <= bitfield;
    s_data_out <= bitfield(0);
END ARCHITECTURE synthesis;

person Matthias Lohr    schedule 29.01.2014    source источник


Ответы (1)


Вот мои комментарии:

Во-первых, "clk" не нужен, так как часы в Chisel неявно.

Во-вторых, вам, вероятно, следует использовать Bool() вместо UInt(width=1) для некоторых ваших сигналов.

val load = Bool(INPUT)

Хотя это, по общему признанию, стилистическое мнение, но оно предотвращает необходимость выполнять приведение .toBool позже.

В-третьих, эта строка не делает того, что вы намереваетесь:

val bitfield = Reg(init = UInt(length))

Это создает регистр, который инициализируется при сбросе в UInt() со значением «длина». Вместо этого, чтобы создать регистр ширины «длины», сделайте следующее:

val bitfield = Reg(outType=UInt(width=length))

Вы также можете просто использовать

val bitfield = Reg(UInt(width=length))

Поскольку параметр по умолчанию для Reg() — это «тип» регистра, который вы хотите создать. Однако, ИМО, это может быть немного двусмысленно. Если вы хотите инициализировать регистр равным 0, сделайте следующее:

val bitfield = Reg(init = UInt(0, length))
person Chris    schedule 05.02.2014