🍒 Cherry Syn チュートリアル — 第8章

組み合わせ回路の記述

Cherry Synでは、process構文を使っても一状態だけにすれば、結果的に組み合わせ回路として合成されます。 しかし、processを使う場合は、クロックとリセットの入力を必ず記述しなければならず、 組み合わせ回路を書くには不自然です。

そこで、Cherry Synでは combinational という構文を導入しました。 クロックやリセットを省略でき、純粋な組み合わせ回路として記述できます。

🧪 例:フロッピーエミュレータの論理

combinational unisdair (
    in uint#4 ph,
    out uint#4 phl,
    in uint#1 en1,
    out uint#1 en1l,
    in uint#1 en2,
    out uint#1 en2l,
    in uint#1 rdr,
    out uint#1 tristate rd,
    in uint#1 senser,
    out uint#1 tristate sense,
    in uint#1 wdat,
    out uint#1 wdatl,
    out uint#1 en1out,
    in uint#1 iic,
    in uint#1 intdrv,
    in uint#1 wreq,
    out uint#1 wreql,
    in uint#1 c_20,
    in uint#1 driveno,
    out uint#1 dik35
) {
    uint#1 en1s, en2s, en2ss, intdrvs, c_20s, drivenos;
    uint#4 phs;

    c_20s = c_20;
    intdrvs = intdrv;
    en2ss = en2;
    drivenos = driveno;

    en1s = en1;
    en2s = (!en1s | (c_20s ? ~en2ss : en2ss));

    phs = ph;
    phl = phs;
    wreql = wreq;
    wdatl = wdat;

    if (c_20s & intdrvs) {
        if (!drivenos) {
            en1out = en1s;
            en1l = 1;
            en2l = en2s;
        } else {
            en1out = en2s;
            en2l = 1;
            en1l = en1s;
        }
    } else {
        en1out = 1;
        en1l = en1s;
        en2l = en2s;
    }

    if ((!en1s) || (!en2s)) {
        if ((!c_20s) | !((intdrvs & (!en1s) & (!drivenos)) | (intdrvs & (!en2s) & drivenos))) {
            rd = rdr;
            sense = senser;
        }
    }

    dik35 = 0;
}

🧠 補足

なお、processでも一状態だけにすれば組み合わせ回路として合成されますが、 クロックとリセットの記述が必要になるため、純粋な組み合わせ回路を書くには不自然です。 combinational は、設計者の意図をより明確に表現するために導入された構文です。

これは単なる構文上の利便性ではなく、Cherry Synの哲学的な選択でもあります。 論理はその性質に応じて、ふさわしい構文で記述されるべきなのです。