verilog代码的不寻常行为

时间:2014-11-11 08:21:37

标签: verilog hdl

我正在编写一个简单的异步序列检测器,但我在某一点上得到了不寻常的结果。代码与" assign a8 = ((y2&&inp1&&~inp2)||(y1&&inp1));"但如果我在我的代码中用以下行替换上面的行,则不能给出正确的结果。

assign a6 =  (y2&&inp1&&~inp2);
assign a5 = (y1&&inp1);
assign a8 = a6||a5;

两者在技术上是相同的,但是当我使用上面的代码行时,我无法理解为什么输出不正确。

    module Async_Design(inp1,inp2,outp);
        input inp1,inp2;
        output outp;
        wire y1 ,y2;

    /*assign a6 =  (y2&&inp1&&~inp2);
    assign a5 = (y1&&inp1);
    assign a8 = (a6||a5);*/

    /*Uncommenting the above section and commenting below 
line is not giving correct result*/
       assign a8 =  ((y2&&inp1&&~inp2)||(y1&&inp1));    
        Delay D1(y1,a8);

        nand(a1,y1,1'b1);
        nand(a2,a1,inp1);
        nand(a3,a2,1'b1);
        nand(a4,a3,inp2);
        nand(a5,a4,1'b1);

        Delay D2(y2,a5);

        assign outp = y1;

    endmodule

    module Delay(q,inp);

        output q;
        input inp;
        reg q;
        initial
        begin
            q=1'b0;
        end
        always @(*)
        begin
            q=((inp&&1'b1)||(inp&&1'b1));
        end

    endmodule 

/***********************************************/
TEST BENCH
/***********************************************/

    module Async_Design_Test;

    reg  inp1,inp2;
    wire outp;
    reg[15:0] sequence1;
    reg[15:0] sequence2;
    integer i;

    Async_Design Async(inp1,inp2, outp);

    initial
    begin

        sequence1 = 16'b 0101_1111_0111_1111;
        sequence2 = 16'b 1010_1010_1110_1111;


       for( i = 0; i <= 15; i = i+1)
       begin
          inp1 = sequence1[i];
            inp2 = sequence2[i];
            #6

            $display( " Input1 = ", inp1,  "  Input2 = ", inp2, "  Output = ", outp,);

       end
    end

    endmodule

任何人都可以帮助我理解这种行为,因为我是HDL编码新手

1 个答案:

答案 0 :(得分:3)

更改后的代码无效。为什么呢?

assign a5 = (y1&&inp1);
...
nand(a5,a4,1'b1);

你要做的是在两个不同的地方驱动a5连接(顺便说一句,你的编译器应该打印一个错误,比如“无法解析网络a5的多个常量驱动程序”)。它不起作用,因为你只能在一个地方开一根电线。如果您更改其中一行,例如:

assign a6 = (y2&&inp1&&~inp2);
assign a7 = (y1&&inp1);
assign a8 = (a6||a7);

您将获得与使用assign a8 = ((y2&&inp1&&~inp2)||(y1&&inp1))相同的输出。

PS考虑使用&|运算符。