我正试图在verilog测试台上模拟CAN总线。我知道我需要为CAN网络中的每个节点提供1条双向总线。如果许多公共汽车试图同时在公交车上写一个值,会发生什么? 0的主导价值是赢还是会产生一些错误?我想的代码就是这样:
//First node
CAN_HIGH = (read) ? 'bz : DATA_NODE_A;
//Second node
CAN_HIGH = (read) ? 'bz : DATA_NODE_B;
如果节点A尝试写1并且节点B尝试写0,那么CAN_HIGH的值是0吗?
答案 0 :(得分:0)
一般情况下,如果您只使用相同的值从多个来源驾驶net
类型,即wire
,则结果将是您驾驶的值。如果值不同,则resut将为 x 。 z
是一种特殊情况,是最弱的值,将被覆盖。
wire bus;
assign bus = en1 ? val1 : `z;
assign bus = en2 ? val2 : `z;
如果两者en1, en2
都关闭,则总线的值为z
;
如果en1
或en2
,但两者都没有,则总线将分配相应的值(1或2)。
如果en1
和en2
都为高,那么,如果val1 == val2
,则总线将获得val1/val2
的值,否则将为x
}。
现在,在verilog中,您可以将此类事物定义为赋值强度,这是不可合成的,但可用于某些情况的行为建模,或者用于测试平台。这将告诉verilog哪个分配应该在比赛中获胜。在verilog中有几个级别的强度,你可以在文档中找到它。这是一个例子:
wire bus;
assign (strong0, weak1) bus = en1 ? val1 : `z;
assign bus = en2 ? val2 : `z;
在上面的示例中,如果en1和en2都为高,且值不同,则第一个赋值将具有更强的' 0'但是weader' 1',因此val1将提供' 0' 0在结果值中,赋值2将提供' 1'。您可以使用不同的力量组合。但是,如果强度相同,则其行为与第一个示例相同。