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