Verilog:`always`和`always @ *`之间的区别

时间:2012-04-02 12:47:28

标签: verilog

always块和always @*块之间是否存在差异?

2 个答案:

答案 0 :(得分:3)

always @*always块的一种类型。它用于推断组合逻辑。

always @(posedge clock)用于推断顺序逻辑。

有关更多详细信息,请参阅IEEE标准(例如1800-2009)。

答案 1 :(得分:1)

他们是不同的!我曾经认为他们是一样的。但事实并非如此。

总是@(*)意味着感知任何东西,编译器会自动填充它。如果是组合逻辑,请使用它!所以你不会忘记任何事情并使功能失败。

永远意味着它总是会执行句子!如果没有延迟,系统暂停,模拟时无法获得结果!非常烦人。

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

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

`时间刻度1ns / 10ps

模块seq_detect3(//检测序列10110     in,//序列输入     clk,//时钟正边沿触发     rst,// reset,active-high synchronous     匹配// out out," 1"匹配     );

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

endmodule