2017-11-24 13 views
0

私は、VerilogテストベンチでCANバスをシミュレートしようとしています。私は、CANネットワークの各ノードに1つの双方向バスが必要であることを知っています。多くのバスが同時にバスに値を書き込もうとするとどうなりますか?支配的な価値が0になるか、これによって若干の誤差が生じるか?私が考えていたコードは次のように行くだろう:ノードAは1とノードBが0を書き込もうと書き込もうとした場合Verilogの複数の双方向バス

//First node 
CAN_HIGH = (read) ? 'bz : DATA_NODE_A; 
//Second node 
CAN_HIGH = (read) ? 'bz : DATA_NODE_B; 

、CAN_HIGHの値は0になりますか?

+0

この場合、シンセサイザーで複数のソースエラーが発生すると思います。 –

答えて

0

一般にnetタイプ(複数のソースからwire)をドライブした場合、同じ値で結果がドライブされます。値が異なる場合は、xとなります。 zは特殊なケースで、最も弱い値で上書きされます。

wire bus; 
assign bus = en1 ? val1 : `z; 
assign bus = en2 ? val2 : `z; 

両方の場合、en1, en2がダウンしている、バスはzの値を持つことになります。

en1またはのいずれかがアップしていても、バスには対応する値(1または2)が割り当てられます。

両方の場合、en1en2が高いval1 == val2場合、その後、バスはそれ以外の場合はxだろう、val1/val2の値を取得します。

ここで、Verilogでは、合成できないが、特定の状況の動作モデリングやテストベンチに使用できる割り当て強度などを定義できます。これは、どの課題が競技会で勝つべきかをVerilogに伝えるでしょう。 Verilogにはいくつかのレベルの強さがあります。ドキュメントで見つけることができます。ここでは一例であり:EN1およびEN2の両方が高く、値が異なる場合は、上記の例で

wire bus; 
assign (strong0, weak1) bus = en1 ? val1 : `z; 
assign bus = en2 ? val2 : `z; 

そのVAL1を提供するように、最初の割り当て 'は、強い「0」が、weaderを「1」になります0 'になり、assignment2は' 1 'を出力します。さまざまな強さの組み合わせを使用できます。ただし、強さが同じ場合は、最初の例のように動作します。