verilog中的posedge只能用在时钟上吗?

Can posedge in verilog be used only on clock?

能否在不是时钟的变量上检测到 posedge?

比如我有一个复位键R,只要按一下就会把机器复位到启动状态。

always @ (posedge clk, posedge R)
    if(R)
      reset_the_machine();
    else
      use_the_next_state();

在设置或重置等信号上使用 边沿 是模板模式合成工具选择在单个 always 中表示异步逻辑的产物堵塞。如果您没有使用 posedge 限定 R,那么 R 的下降沿 (negedge) 将执行 use_next_state() 分支。因此模拟会将复位的释放解释为 posedge 时钟。

最初开发 Verilog 时,其目的是使用单独的 always 块来实现使用过程连续分配的同步和异步行为

always @(R)
  if (R)
     assign state = initial_state;
  else 
     deassign state;

always @(posedge clk)
    state <= next_state;

但今天的综合工具不再支持此模板,可能是因为与完全连续的 assign 语句混淆。

你的问题有两个问题:

can posegde in verilog be used only on clock?

答案是否定的

Can a posedge be detected on variables that aren't a clock?

答案是肯定的。

verilog 语言中没有时钟。每个信号都是平等的。可以在任何变量的模拟中检测到边缘。边缘检测本身就是一个模拟工件。

时钟只是一个现代硬件神器。 verilog 程序反映硬件行为,因此需要以特定的硬件相关方式对时钟进行编程。但这只是一个编程技巧。

关于您的示例,请参阅 dave-59 的回答。