始终敏感度列表中的XOR。 Verilog

时间:2019-01-24 16:20:33

标签: verilog

有人可以解释这行中的情况吗?“总是@(posege(sclk ^(CPHA ^ CPOL))或posege spi_word_send”。我是verilog的初学者,不了解如何在敏感度列表中使用XOR。

1 个答案:

答案 0 :(得分:0)

通常,过程块可以包含延迟或事件等待语句,这些语句会阻塞过程,直到满足时间或事件为止。这些语句在仿真和综合中都用于编写测试平台和描述逻辑。这些构造的灵活性(例如#延迟或@事件等待)非常广泛。但是,当使用它们来实际描述硬件时,只能在有限的情况下使用它们。

您的情况:@(posedge (sclk ^ (CPHA ^ CPOL)) or posedge spi_word_send)只是说,等待表达式sclk ^ CPHA ^ CPOL从低变高(posedge)或spi_word_send从低变高,然后always块中包含的表达式(xor表达式从低变高的一个例子将是sclk = 1, CPHA = 1, CPOL = 0变成sclk = 1, CPHA = 1, CPOL = 1,(1 ^ 1 ^ 0 = 0,1 ^ 1 ^ 1 = 1)。

该语言允许您拥有如此复杂的等待表达式,并且仿真工具通常会按预期运行它,但是如果应该合成该表达式,则需要确保您确实在描述所需的硬件。正如toolic所提到的,这不是一个好的样式,它描述的是一个具有相当复杂的时钟信号的触发器(或者可能是置位/复位,综合工具会尽力而为,但是如果通过的话,它可能会产生一些奇怪的东西);它肯定是异步逻辑。大多数设计是同步的,而综合工具通常被设计为在行为上像上述那样描述时处理同步设计。因此,对always @块施加了很大的限制,例如要成为always @(posedge some_clock or negedge some_asserted_low_reset)之类的东西,以确保代码推断干净的触发器会清除时钟并复位。