我正在编写一个简单的异步序列检测器,但我在某一点上得到了不寻常的结果。代码与" 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编码新手
答案 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考虑使用&
和|
运算符。