always
块和always @*
块之间是否存在差异?
答案 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