推荐答案
测试一下
题目
Please draw the state machine transmissiondiagram of the array detection 10010,code with Verilogand build the testbench…
参考答案与知识点
参考答案
序列检测器用于检测输入bit流中是否出现'10010'。采用Mealy或Moore型状态机,通常使用Moore型,每个状态对应已匹配的部分序列。定义状态:IDLE(无匹配)、S1(匹配'1')、S2(匹配'10')、S3(匹配'100')、S4(匹配'1001')、S5(匹配'10010',输出检测成功)。状态转移:从IDLE开始,输入1跳转到S1,输入0保持IDLE;S1输入0跳转S2,输入1自循环(因为连续'1'可作为新序列起点);S2输入0跳转S3,输入1回到S1;S3输入1跳转S4,输入0回到IDLE(注意:连续两个0后需重新开始);S4输入0跳转S5(检测成功),输入1回到S1;S5输出检测标志后,根据下一输入跳转:若输入0则回到IDLE(因为'10010'后输入0可能开始新序列,但注意序列重叠:若后续输入为'010'可匹配'10010'?实际上'10010'后输入0,可能形成'100100',重叠部分为'10010'后下一个0,但新序列从最后一位开始?安全做法:S5输入0跳转IDLE,输入1跳转S1。状态图可手绘或用文字描述。
Verilog代码示例(Moore型):
module seq_detector(
input clk, rst_n, din,
output reg dout
);
parameter [2:0] IDLE=3'd0, S1=3'd1, S2=3'd2, S3=3'd3, S4=3'd4, S5=3'd5;
reg [2:0] state, next;
always @(posedge clk or negedge rst_n)
if (!rst_n) state <= IDLE;
else state <= next;
always @(*) begin
next = state;
case(state)
IDLE: next = din ? S1 : IDLE;
S1: next = din ? S1 : S2;
S2: next = din ? S1 : S3;
S3: next = din ? S4 : IDLE;
S4: next = din ? S1 : S5;
S5: next = din ? S1 : IDLE;
default: next = IDLE;
endcase
end
always @(posedge clk or negedge rst_n)
if (!rst_n) dout <= 1'b0;
else if (state == S4 && din == 0) dout <= 1'b1; // 注意当state=S4且下一周期进入S5时输出,或者用组合逻辑在S5时输出
else dout <= 1'b0;
endmodule
测试平台testbench需覆盖所有状态转移及输出条件,达到100% FSM覆盖率(状态覆盖、转移覆盖、条件覆盖)。构造测试序列:
- 复位后遍历所有状态:输入序列'1'(IDLE->S1),'0'(S1->S2),'0'(S2->S3),'1'(S3->S4),'0'(S4->S5,输出检测),然后S5后输入'1'看转移回S1,输入'0'回IDLE。
- 还需覆盖各状态的自循环或特殊分支:如IDLE输入0保持,S1输入1保持,S2输入1回S1,S3输入0回IDLE,S4输入1回S1,S5输入0回IDLE。
- 测试用例:强制约束输入序列遍历所有边。例如:{1,0,0,1,0}完成完整检测;插入多余位如{1,1,0,0,1,0}覆盖S1自循环、S2到S1等;{0,0,0}覆盖IDLE保持和S3回IDLE等。
- 使用SystemVerilog的covergroup或功能覆盖率可记录状态和转移。简单方式:在testbench中监测state和din,确保每个转移至少发生一次。
涉及知识点
- 序列检测器状态机设计
- Moore型与Mealy型区别
- 状态转移图绘制
- Verilog三段式状态机
- FSM覆盖率类型与覆盖方法
- testbench测试用例构造