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;
}
combinational
ブロックでは、クロックやリセットの記述が不要です。rd
や sense
のようなトライステート出力もサポートされています。なお、process
でも一状態だけにすれば組み合わせ回路として合成されますが、
クロックとリセットの記述が必要になるため、純粋な組み合わせ回路を書くには不自然です。
combinational
は、設計者の意図をより明確に表現するために導入された構文です。
これは単なる構文上の利便性ではなく、Cherry Synの哲学的な選択でもあります。 論理はその性質に応じて、ふさわしい構文で記述されるべきなのです。