process process1(clkin uint#1 clk, rstin uint#1 rst, out uint#8 latch x)
{
...
x = 100;
while (1);
}
ポート入出力は、記述されたタイミングで直接入出力されます。
latch 属性を付けると、入力の場合は1クロック前の値がラッチされて入力され、出力の場合はラッチされて1クロック後に出力されます。
入出力がバタつくと困る場合は、ラッチを使うと安定します。
process process1(clkin uint#1 clk, rstin uint#1 rst, out uint#8 tristate x)
{
...
x = 100;
while (1);
}
tristate 属性を付けると、出力が発生したタイミングで値が出力され、それ以外のタイミングではハイ・インピーダンスになります。
latch でも tristate でもない場合、その他のタイミングでの出力値は未定(でたらめ)になります。
process process1(clkin uint#1 clk, rstin uint#1 rst, in uint#8 pulldown x)
{
... = x;
while (1);
}
入力ポートに pullup や pulldown 属性を付けることで、回路上での電位を安定させることができます。
入出力が発生したタイミングを検出したい場合は、en 属性を使います。
process process1(clkin uint#1 clk, rstin uint#1 rst, out uint#8 en x)
{
x = 100;
while (1);
}
この記述を高位合成すると、以下のような Verilog が生成されます:
module PROCESS1 (
input wire CLK,
input wire RST,
output wire [7:0] X,
output wire X_EN);
X_EN は、X に出力が発生したタイミングで1になり、それ以外は0になります。
process process2(clkin uint#1 clk, rstin uint#1 rst, in uint#1 x_en, in uint#8 x)
{
...
}
toplevel logicboy(in uint#1 clk, in uint#1 rst, ...)
{
com uint#8 en x;
process1(clk, rst, x);
process2(clk, rst, x en, x, ...);
}
トップレベルで com 信号を宣言する際にも en を付けます。
実際の回路では、x に対して 8ビットの信号線と 1ビットのイネーブル信号が生成されます。
x en はイネーブル信号(1ビット)、x はデータ信号(8ビット)を表します。
process2 はこれら両方を参照します。
同様に、入力ポートに対しても、入力が発生したタイミングで1になるイネーブル信号を生成することができます。
それでは皆さん、また次回お会いしましょう!