Verilog多个信号在Always块的灵敏度列表中发生变化

Verilog多个信号在Always块的灵敏度列表中发生变化,verilog,Verilog,我想知道是否只有当灵敏度列表中的多个信号一起改变时,才可能执行always块 如中所示,假设我有一个信号'in'和另一个'posedge-clk'。我希望在两个信号都改变时执行always块。有可能吗?如果有,它的语法是什么?一般来说,没有办法做到这一点,因为这实际上并不映射到人们通常会合成的任何类型的标准逻辑单元。然而,如果你描述你的最终目标是什么,我相信有人可以在使用可综合逻辑的同时为你指出正确的方向。我很难想象你想要这样一个街区干什么 这是对原始问题的回答,而不是评论中揭示的问题 正如@T

我想知道是否只有当灵敏度列表中的多个信号一起改变时,才可能执行always块


如中所示,假设我有一个信号'in'和另一个'posedge-clk'。我希望在两个信号都改变时执行always块。有可能吗?如果有,它的语法是什么?

一般来说,没有办法做到这一点,因为这实际上并不映射到人们通常会合成的任何类型的标准逻辑单元。然而,如果你描述你的最终目标是什么,我相信有人可以在使用可综合逻辑的同时为你指出正确的方向。我很难想象你想要这样一个街区干什么

这是对原始问题的回答,而不是评论中揭示的问题

正如@Tim所提到的,没有硬件结构可以做到这一点<代码>始终@(posedge clk)创建触发器,对clk边缘的数据进行采样

always@*
块创建组合逻辑,当分配或选择信号的右侧发生变化时,模拟器会对组合逻辑进行评估

如果您有多个由D型触发器驱动的1位信号,您可以对输入(D)和输出(Q)进行异或(
^
),以创建一个1时钟周期宽的信号,指示值已更改。这些变化信号可以组合起来产生一个使能信号。用作触发器的选择或启用

always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
    //reset condition
  end
  else if (enabled)
    //Enabled condition
  end
  // no final else, everything will holds its value
end
或可作为闩锁的启用:

//synopsys async_set_reset "rst_n"
always @* begin
  if (~rst_n) begin
    // Reset 
  end
  else if (latch_open) begin
    //next datavalue
  end
end

谢谢你的回复,蒂姆!实际上,我这样做的目的是,我有一个累加器寄存器模块,它也有一个输入端口和一个输入时钟。我只想在时钟周期的正边缘将数据加载到累加器寄存器中,但同样,只有在输入也正确更改时才应该这样做?这就是为什么我希望在两者都更改时执行always块。@Karthik-累加器寄存器是否只锁定输入端口,或者你想数一数输入端口改变的次数?嗯,我明白你的意思。谢谢我刚刚在累加器模块的always块的敏感度列表中使用了“posedge clk”,但当我运行代码时,累加器寄存器从未改变其值。您只需使用d触发器对每个时钟posedge上的输入端口进行采样即可。您不必手动检测D管脚上的变化,因为如果它没有变化,那么Q管脚将保持不变,这正是您试图实现的。触发器只是在每个时钟边缘对输入进行采样,它们不知道值是否发生了变化,也不需要知道@卡提克