2012-11-15 4 views
0

저는 Verilog를 처음 사용하고 있으며 두 개의 모듈을 정의하는 verilg 코드를 작업 중입니다. 첫 번째 모듈은 두 숫자의 모듈을 계산하고 두 번째 모듈은 결과를 사용하여 숫자에 대한 연산을 수행합니다.Verilog의 타이밍 문제

두 모듈 모두에서 동일한 clk가 사용 되었기 때문에 결과가 잘못되었고 값을 신경 쓰지 않아도됩니다. 동기화를위한 제안 사항.

국방부 모듈 상부 모듈의

module mod(m,a,b); 
    input [15:0] a,b; 
    output [15:0] m; 

    reg [31:0] mod; 
    reg [31:0] mul; 

    integer i; 

    always @* begin 
    mul = a*b; 
    mod = 32'h80008000; 
    for(i=0;i<16;i=i+1) begin 
     if(mul > mod) begin 
     mul = mul - mod; 
     mod = mod >> 1; 
     end 
     else begin 
     mod = mod >> 1; 
     end 
    end 
    assign m=mul[15:0]; 
endmodule 

부 :

initial begin 
    keyp <= 2'b10; 
    shift <= 1'b0; 
end 

always @(posedge clk) begin 
    if(load) 
    case (keyp) 
     2'b10: begin 
      key[127:64] <= {k1,k0}; 
      keyp  <= 2'b01; 
     end 
     2'b01: begin 
     key[63:0] <= {k1,k0}; 
     keyp  <= 2'b00; 
     shift  <= 1'b1; 
     end 
    //default: keyp <=2'b00; 
    endcase 
    else if (shift) begin 
    //shift key for first round 
    temp[24:0] <= key[127:103]; 
    key[127:25] <= key[102:0]; 
    key [24:0] <= temp [24:0]; 
    shift   <= 1'b0; 
    end 
end 

assign w1[2*SIZE-1:SIZE] = d1+key[2*SIZE-1:SIZE]; 
assign w1[3*SIZE-1:2*SIZE] = d2+key[3*SIZE-1:2*SIZE]; 

mod mod1(w1[SIZE-1:0],  d0, key[SIZE-1:0]  ); 
mod mod2(w1[4*SIZE-1:3*SIZE], d3, key[4*SIZE-1:3*SIZE]); 

답변

0

X 용의가 casex 문이나 카르노 맵에서 염려하지 않습니다라고합니다, 여기에 그들은 알 수없는 값을 나타냅니다. 알 수없는 값은 초기화 (재설정)되지 않은 값 또는 여러 (충돌하는) 드라이버에서 가져올 수 있습니다.

always @* begin 
    mul = a*b; 
    mod = 32'h80008000; 
    for(i=0;i<16;i=i+1) begin 
    if(mul > mod) begin 
     mul = mul - mod; 
     mod = mod >> 1; 
    end 
    else begin 
     mod = mod >> 1; 
    end 
    end 

always @*가 조합 블록, 당신은 마지막 할당이 어떤 영향을 미칠 것입니다 MUL 여러 번 지정 :

국방부 모듈은 코드 섹션이 포함되어 있습니다.

여기서 for 루프를 사용하면 c에서와 같이 변수를 다시 사용하려는 것처럼 보입니다. 우리는 하드웨어를 묘사하고 있으며 그 값은 모듈 사이의 플립 플롭 또는 와이어로서 어딘가에 존재하며 주어진 클록 사이클에서 단일 값만을 유지할 수 있다는 것을 기억하십시오.

mul = mul - mod;이 조합이 작동하지 않는다면, 플립 플롭을 추가하여 루프를 해제해야합니다.

0

차단 할당으로 동일한 값을 여러 번 할당하면 Verilog가 완벽하게 유효합니다. 동일한 용어가 양측에 모두 표시 되더라도 적어도 한 번 이상 할당 된 경우라면 문제가 없습니다.

여기 코드는 불완전하지만 코드가 여러 위치에서 '키'에 지정되어있는 것 같습니다. 둘 다 mod 인스턴스의 출력과 클록 된 블록 내부에 있습니다. 이 둘은 키의 가치에 대해 '동의하지 않음'을 언제든지 알지 못하는 것을 나타내는 것 외에도 X. X로 볼 것입니다. 또한 두 개의 다른 과제가 충돌하는 경합을 반영합니다.

이 코드가 의미하는 바가 무엇인지 (이후에는 일종의 암호화 인 것처럼 보임) 수정할 수는 없지만 할당을 키로 구분해야합니다.

+0

[다른 답변, 섹션 2] (http://stackoverflow.com/questions/14083475/incrementing-a-counter-variable-in-verilog-combinational-or-sequential/14085967#14085967) 좋아, 조합 블록에서 과제의 양면에 같은 용어를 사용하는 것) – Morgan