如何在verilog中控制两个不同程序块中的标志?

How to control a flag in two different procedural blocks in verilog?

我想在进入程序块#1 后升起一个标志,并且我想在另一个程序块中将其重置为零。当然,我收到一条错误消息,说该标志是由太多驱动程序驱动的。我该如何克服这个问题?

块1,对sw敏感(FPGA板开关):

always @ (sw)
flag =1;
begin 
case (sw)   
8'bxxxxxx01: x2= 13'd1249;
8'bxxxxxx10: x2= 13'd2499;
8'bxxxxxx11: x2= 13'd3749;

endcase

end

块2,对CLK敏感:

always @ (posedge CLK)

        begin

        if (counter2 == x2)
        begin
        counter2 <=0;
        flag=0;
        end

        else
        counter2 <= counter2 +1;

        end

假设所有初始化都已完成。

一种方法是设置和重置标志以及侦听这些标志的 FSM。

localparam S_RESET = 2'b0;
localparam S_SET   = 1'b1;
reg state;

always @(posedge clk) begin
  case ({flag_set, flag_reset})
    2'b00 : state <= state;
    2'b01 : state <= S_RESET;
    2'b10 : state <= S_SET;
    2'b11 : state <= S_SET; //Choose priority
  endcase
end

但要注意 always @ (sw) 应该写成 always @(*) 即自动敏感列表。这表示硬件的组合块,所有输出都应基于输入(或触发器)。

我希望这能说明:

always @ (sw)
  flag =1;

不代表硬件,不可合成。 flag 基于触发模拟器而不是基于输入的值。