Verilog:“总是”和“总是”的区别@*`

Verilog:“总是”和“总是”的区别@*`,verilog,Verilog,始终块和始终*块之间有区别吗?始终*是一种类型的始终块。它用于推断组合逻辑 始终@(posedge时钟)用于推断顺序逻辑 有关更多详细信息,请参阅IEEE标准(例如1800-2009)。它们是不同的!我过去认为他们是一样的。但事实并非如此 总是@(*)意味着感知任何东西,编译器会自动填充它。如果是组合逻辑,请使用它!因此,您不会忘记任何东西,并使函数失败 始终意味着句子将始终执行!如果没有延迟,系统将停止,模拟时将不会得到任何结果!很烦人 例如,在FSM的下一个状态逻辑部分:如果使用always

始终
块和
始终*
块之间有区别吗?

始终*
是一种类型的
始终
块。它用于推断组合逻辑

始终@(posedge时钟)
用于推断顺序逻辑


有关更多详细信息,请参阅IEEE标准(例如1800-2009)。它们是不同的!我过去认为他们是一样的。但事实并非如此

总是@(*)意味着感知任何东西,编译器会自动填充它。如果是组合逻辑,请使用它!因此,您不会忘记任何东西,并使函数失败

始终意味着句子将始终执行!如果没有延迟,系统将停止,模拟时将不会得到任何结果!很烦人

例如,在FSM的下一个状态逻辑部分:如果使用always而不是always@(*),则它不起作用

下面是我写的一个简单的序列检测器,这两个检测器是不同的。如果需要,您可以编写tb来运行它

`时间刻度为1ns/10ps

模块seq_detect3(//检测序列10110 在,//序列输入中 时钟,//触发时钟正边缘 rst,//复位,有效高同步 匹配//输出匹配,“1”表示匹配 );

输入,时钟,rst;
输出匹配;
导线输入、时钟、rst;
注册匹配;
reg[5:0]状态,下一个_状态;
参数IDLE=6'b000001//没有匹配的位
参数STATE1=6'b000010//前1位匹配
参数STATE2=6'b000100//前2位匹配
参数STATE3=6'b001000//前3位匹配
参数STATE4=6'b010000//前4位匹配
参数状态5=6'b100000//所有5位都匹配
//-----------S.M.和O.F.L-----------
始终@(posedge clk)开始
如果(rst)开始
状态
input in, clk, rst;
output match;
wire in, clk, rst;
reg match;
reg [5:0] state, next_state;
parameter IDLE = 6'b000001;     //no bit matched
parameter STATE1 = 6'b000010;   //first 1 bit matched
parameter STATE2 = 6'b000100;   //first 2 bits matched
parameter STATE3 = 6'b001000;   //first 3 bits matched
parameter STATE4 = 6'b010000;   //first 4 bits matched
parameter STATE5 = 6'b100000;   //all 5 bits matched

//-----------S.M. & O.F.L.-----------
always @ (posedge clk) begin
    if(rst) begin
        state <= IDLE;
        match <= #1 0;
    end
    else begin
        state <= next_state;
        if(state == STATE5) begin
        match <= #1 1;
        end
        else begin
            match <= #1 0;
        end
    end
end 

//-----------next state logic-----------
always @(*) begin    //Can not replaced by always here!!
    case(state)
        IDLE:   if(in) next_state = STATE1; //0 keep, 1 next
                        else next_state = IDLE; 
        STATE1: if(in) next_state = STATE1; //0 next, 1 keep
                        else next_state = STATE2;
        STATE2: if(in) next_state = STATE3; //0 idle, 1 next
                        else next_state = IDLE;
        STATE3: if(in) next_state = STATE4; //0 s2, 1 next
                        else next_state = STATE2;   
        STATE4: if(in) next_state = STATE1; //0 next, 1 s1
                        else next_state = STATE5;
        STATE5: if(in) next_state = STATE3; //0 idle, 1 s3
                        else next_state = IDLE;
        default: next_state = IDLE;
    endcase
end