推荐答案
测试一下
题目
Please draw the state machine transmissiondiagram of the array detection 10010,code with Verilogand build the testbench…
参考答案与知识点
参考答案
我们分析题目:检测序列10010的序列检测器。要求画出状态图,Verilog实现,testbench和testcase达到100% FSM coverage。需要给出答案。
参考答案正文应包含:状态图(用文字描述或ASCII画图),状态转移表,Verilog代码(状态机),testbench思路,如何达到100%覆盖率的testcase。
知识点:序列检测器,状态机设计(Moore或Mealy),覆盖率(状态覆盖、转移覆盖),testbench设计。
注意:序列检测10010,可以重叠检测(如10010 010 重叠?通常序列检测允许重叠,但描述要明确)。常见的是非重叠,但重叠也可以。10010若重叠:比如输入10010010,在检测到10010后,下一个输入是0,可能开始新的序列?但重叠时,后一个序列可能从之前的最后一位开始?一般序列检测器允许重叠,例如检测101时,输入10101可检测两次。对于10010,重叠需要关注:检测到10010后,如果下一个输入是0,则最后两个10与新的序列可能结合?但10010后跟0形成100100,不能开始新序列,因为新序列需要1开头。若后跟1,则100101,可能开始新的10010?从第二个0开始?更常见的是非重叠,但题目未明确,通常实现可重叠。这里以可重叠为例:状态机设计为Moore型,每个状态输出检测到标志。或者Mealy型。建议用Moore,状态数:初始状态S0,检测到1进入S1,检测到10进入S2,100进入S3,1001进入S4,10010进入S5(输出1)。若允许重叠,当在S5时,若下一输入为0,则回到S2(因为最后两位是10,匹配10?需要仔细考虑:当前已检测到10010,最后两位是10,若下一输入为0,则形成100100,最后两位是00,不匹配任何前缀;若输入为1,则形成100101,最后三位是101,不匹配;但重叠检测通常指当检测到完整序列后,看能否从最后若干位开始新序列。对于10010,完整序列后,当前状态S5,假设输入为1,则新序列应以1开头,但此时最后一位是0,输入1后最后两位变为01?从S5状态:输入1,可以认为当前已有最后一位0,新输入1,形成01,不是1开头,但若考虑从S5状态直接跳转到S1(因为检测到1),这是对的:因为S5的最后一位是0,但新输入1,整体最后一位是1,所以下一个状态应该是S1(检测到1)。同理输入0,则最后一位是0,但前面还有1?需要设计状态转移,使得S5时输入0,则应该转移到S2?因为最后两位是10?但S5时,之前序列是10010,最后两位是10,输入0后,最后三位是100,所以转移到S3?需要画状态图。常见做法:设计一个基于当前状态和输入,转移到下一个状态,取决于当前状态和输入。为了简化,可以用状态表,将每个状态视为已匹配的前缀。然后根据输入决定下一个状态。例如:
S0: 无匹配。输入1 -> S1; 0 -> S0
S1: 匹配"1"。输入0 -> S2; 1 -> S1(因为连续两个1,最后一个1作为新开始)
S2: 匹配"10"。输入0 -> S3; 1 -> S1
S3: 匹配"100"。输入0 -> S0? 1000? 不匹配,但最后一位0,前面两个00,无前缀,应回到S0? 但100输入0后是1000,没有任何匹配的前缀,所以应回到S0。或者考虑最长前缀匹配:1000,后缀有000,00,0,都不匹配1或10等,所以S0。输入1 -> 1001? 最后一位1,前缀"1"匹配,所以S1。
S4: 匹配"1001"。输入0 -> S5; 输入1 -> 10011? 最后一位1,但前面是001?实际上1001输入1得到10011,后缀有011,11,1,只有1匹配,所以S1。
S5: 匹配"10010"(输出1)。输入0 -> ? 10010输入0得100100,后缀有00100,0100,100,00,0。最长匹配前缀:100? 因为最后三位100?实际上从后往前看:最后一位0,倒数第二位0,倒数第三位1?100100的末尾是100,所以可以匹配S3(100)。但S5状态本身代表已匹配到10010,当检测到完整序列后,通常要输出标志,然后继续检测。如果是重叠,S5后输入0,应转移到S3(因为最后三位100)。输入1 -> 100101,末尾是101?不匹配任何前缀?最后一位1,倒数第二位0,倒数第三位1,形成101,不是10010的前缀。但可以匹配S1? 因为最后一个1,所以S1。所以S5输入1 -> S1。
注意:有的设计将S5作为接受状态,然后输出1后,根据输入跳转到适当状态。以上是常见重叠序列检测。
题目要求"100% fsm coverage",通常指状态覆盖和转移覆盖。需要构造测试序列覆盖所有状态和所有可能的转移。对于Moore型,每个状态可能有2种输入,共5个状态(S0-S5),那么转移边有5*2=10条。需要测试所有转移。测试case设计:例如输入序列:1,0,0,1,0, ... 但要注意覆盖所有边。可以设计多个短序列。
由于需要写出testbench和testcase,在答案中应描述如何构造测试向量。可以在Verilog代码中写一个initial块,依次输入序列,用$monitor或assert检查状态跳转。
这里给出答案:包含状态图(文字描述),状态转移表,Verilog代码(module detection, input clk,rst,din, output detected; reg [2:0] state, next; 参数化状态),testbench中定义时钟,复位,输入序列:覆盖所有转移。例如:覆盖S0->S0(0), S0->S1(1); S1->S
涉及知识点
- sta
- Verilog
- 状态机