2017-12-20 4 views
2

을의 Verilog에 난 그냥 Verilog를 배우고 시작하고 그래서 나는이 쓴 1010 순서 찾는 가루 투성이 기계 만들려고 b를 :차이 {A, B} == 2'b10과 & ~

module Find1010(input clk, input in, output reg out); 
    reg [1:0]st = 0; 
    wire a = {st[0], in} == 2'b10; 
    wire b = {st , in} == 3'b101; 
    always @(posedge clk) 
    begin 
     out = a & st[1]; 
     st = {a | b, in}; 
    end 
endmodule 
는 그것은 일을하지만 난 wire a = st[0] & ~in;에 선 wire a = {st[0], in} == 2'b10;

을 변경 한 후 출력이 왜 일어나고 {st[0], in} == 2'b10st[0] & ~in의 차이점은 무엇입니까되어 항상 0인가?

module Test; 
    reg in = 0, clk = 1; 
    wire result; 
    initial begin 
     #4 in = 1; 
     #4 in = 0; 
     #2 in = 1; 
     #2 in = 0; 
     #2 in = 1; 
     #2 in = 0; 
     #2 in = 1; 
     #4 in = 0; 
     #2 in = 1; 
     #2 in = 0; 
     #3 $finish; 
    end 
    initial forever #1 clk = ~clk; 
    always @(negedge clk) 
     $display("Input: %b Output: %b", in , result); 
    Find1010 Mealy_Machine(
     .clk(clk), 
     .in(in), 
     .out(result) 
    ); 
endmodule 

답변

2

는 (X 용의가 관여하는 경우는 제외) 차이

문제는 당신이 당신의 테스트 벤치에서 경쟁 조건이있다 없다 :

이 내가 쓴 테스트 벤치입니다. in에 비 차단 할당을 사용해야합니다. 또는 클록주기를 변경하여 in으로의 변경이 클럭 에지에 속하지 않도록하십시오.

+0

다음은 변경해야 할 몇 가지 사항입니다. 1) _dut_ 모듈에서 '출력'및 'st'에 대해 비 차단을 사용합니다. 2) 테스트 벤치에서 $ display에'always @ *'를 사용하십시오. – Serge

+0

@ Serge, 1)에 동의, 2)에 동의하지 않음, 큰 테스트 벤치에 대해서는 너무 많은 출력. 특정 디버그 경우에만 - 여기서는 도움이되지 않습니다. –

0

둘 다 같습니다.

다음은 관련 코드 스냅 샷입니다. 당신이 ===를 사용하는 경우

module temp(); 
    reg a, b; 
    wire c, d; 

    assign c = ({a, b} == 2'b10); 
    assign d = (a & ~b); 

    always @ (a, b) 
    begin 
    $display("------"); 
    $display("a = %0b, b = %0b, c = %0b", a, b, c); 
    $display("a = %0b, b = %0b, d = %0b", a, b, d); 
    end 

    initial 
    begin 
    a = 1'b0; b = 1'b0; 
#1 a = 1'b0; b = 1'b1; 
#1 a = 1'b0; b = 1'bz; 
#1 a = 1'b0; b = 1'bx; 
#1 a = 1'b1; b = 1'b0; 
#1 a = 1'b1; b = 1'b1; 
#1 a = 1'b1; b = 1'bz; 
#1 a = 1'b1; b = 1'bx; 
#1 a = 1'bx; b = 1'b0; 
#1 a = 1'bx; b = 1'b1; 
#1 a = 1'bx; b = 1'bz; 
#1 a = 1'bx; b = 1'bx; 
#1 a = 1'bz; b = 1'b0; 
#1 a = 1'bz; b = 1'b1; 
#1 a = 1'bz; b = 1'bz; 
#1 a = 1'bz; b = 1'bx; 
    end 
endmodule 

// Output - 
------ 
a = 0, b = 0, c = 0 
a = 0, b = 0, d = 0 
------ 
a = 0, b = 1, c = 0 
a = 0, b = 1, d = 0 
------ 
a = 0, b = z, c = 0 
a = 0, b = z, d = 0 
------ 
a = 0, b = x, c = 0 
a = 0, b = x, d = 0 
------ 
a = 1, b = 0, c = 1 
a = 1, b = 0, d = 1 
------ 
a = 1, b = 1, c = 0 
a = 1, b = 1, d = 0 
------ 
a = 1, b = z, c = x 
a = 1, b = z, d = x 
------ 
a = 1, b = x, c = x 
a = 1, b = x, d = x 
------ 
a = x, b = 0, c = x 
a = x, b = 0, d = x 
------ 
a = x, b = 1, c = 0 
a = x, b = 1, d = 0 
------ 
a = x, b = z, c = x 
a = x, b = z, d = x 
------ 
a = x, b = x, c = x 
a = x, b = x, d = x 
------ 
a = z, b = 0, c = x 
a = z, b = 0, d = x 
------ 
a = z, b = 1, c = 0 
a = z, b = 1, d = 0 
------ 
a = z, b = z, c = x 
a = z, b = z, d = x 
------ 
a = z, b = x, c = x 
a = z, b = x, d = x 
------ 

그러나, 출력은 c & d 다를 수 있습니다.

이유 ==하지 않는 반면 === 또한, 계정 1'bx & 1'bz에 걸리는 것이다.

assign c = ({a, b} == 2'b10); 
assign d = (a & ~b); 

------ 
a = 1, b = z, c = 0 
a = 1, b = z, d = x 
관련 문제