【问题标题】:XOR in always sensitivity list. Verilog总是敏感列表中的异或。 Verilog
【发布时间】:2019-01-25 05:51:32
【问题描述】:

有人可以解释这一行发生了什么“总是@(posedge(sclk ^(CPHA ^ CPOL))或posedge spi_word_send”。我是verilog的初学者,不明白如何在敏感度列表中使用XOR。谢谢。

【问题讨论】:

  • 这似乎是一个危险的敏感度列表。如果CPHACPOL 曾经异步更改,您最终会遇到很多意外的执行条件。您可能还应该以CS 为低为条件。

标签: verilog


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多