2014-01-09 1 views
1

나는 위에서 언급 한 아키텍처를 기반으로 부호있는 숫자에 대한 곱셈기 누산기를 설계하고 있습니다. 필자는 부분 제품을 생성하고 캐리 세이빙 축전지에 대해 부스 인코더 용 모듈을 작성했으며 두 가지 모두 올바르게 작동하고 있습니다. 이제, 이러한 하위 부품을 통합하기 위해 작성된 마지막 모듈에서 첫 번째 클럭 사이클에서 두 개의 입력을 받아들이고 부분 곱을 생성 한 다음 이전 승수의 결과를 누적하는 carry 저장 가중치로 전달하려고합니다. 현재의 것. 결과는 다음 클럭 사이클에서 저장되고 두 번째 레지스터에 표시됩니다. 처음에 모든 레지스터는 0으로 재설정됩니다. 캐리 세이프 누적 기는 http://infolab.stanford.edu/pub/cstr/reports/csl/tr/94/617/CSL-TR-94-617.appendix.pdf 링크의 그림 A.6을 기반으로합니다. 최종 레벨은 carry look ahead adder로 구성되어 누적 된 결과를 출력합니다. 코드의 관련 부분은 다음과 같습니다 리셋 = 1, 및 즉시 리셋 = 0으로, 그들이 생각하는가 '1'과 '의 값을 취할 때radix-4 기반 병렬 곱셈 누적 기 수정 된 부스 알고리즘

 CSA_hope csahope (znew, zcnew, pv[0][8:0], pv[1][8:0], pv[2][8:0], pv[3][8:0], 
    sasa, product, xy[19:16], dealsign);//pv=partial products, znew=output of csa, 
    product=final accumulated result, xy=input values 
always @ (posedge clk) 
    begin 
    if (reset) 
     begin 
      xy <= 20'b0; 
      product <= 16'b0; 
      sasa <= 2'b0; 
      dealsign <= 5'b0; 

     end 
    else 
     begin 
      dealsign[0] = ~(multiplicand[7]^pv[0][8]); 
      dealsign[1] = ~(multiplicand[7]^pv[1][8]); 
      dealsign[2] = ~(multiplicand[7]^pv[2][8]); 
      dealsign[3] = ~(multiplicand[7]^pv[3][8]); 
      dealsign[4] = (multiplicand[7]^pv[0][8]); 

      xy <= {N, multiplicand, multiplier}; 
      sasa <= 2'b11; 
      product <= znew; 
     end 
    end 

레지스터의 사사와 dealsign는 처음에 0을 포함 E '를 캐리 세이브 누적 계산기에 각각 입력합니다 (그림 A.6 참조). 그러나, 이러한 일은 발생하지 않으며, 1과 E로 값을 변경하기 위해 여분의 클록 사이클을 소비하므로 잘못된 결과가 생성됩니다. 여기에이 코드를 작성한 테스트 벤치입니다 :

always 
#5 clk = !clk; 
initial 
begin 
    $monitor ($time," clk=%b reset=%b x=%d y=%d xy=%b p0=%b p1=%b p2=%b p3=%b znew=%b product=%b(%d) 
    dealsign=%b sasa=%b\n",clk, reset, 
    multiplicand, multiplier, fmac.xy,fmac.pv[0][8:0],fmac.pv[1][8:0],fmac.pv[2] [8:0],fmac.pv[3][8:0], fmac.znew,product,product,fmac.dealsign,fmac.sasa); 
    #0 clk = 0; multiplicand = 10; multiplier = 19; reset = 1; 
    #10 reset = 0; N = 4'b0001; 
    #30 multiplicand = 11; multiplier = 13; N = 4'b0010; 
    #50 $finish; 
end 

그래서, dealsign의 필수 값이 아니라 t에서보다, t = 25에서오고는 = 15 따라서, t의 제품은 = 25에 나온다 0000000010111110 (190) 대신 0000001010111110 (702)이되어야합니다. 누군가이 코드를 디버깅하거나 다른 방법을 제안 할 수 있습니까?

+0

'collabign [0] ='과 (과) 비슷한 줄은''dealign [0] <='으로 변경해야합니다. – Morgan

+0

RTL 시뮬레이션에서 디지털 논리가 0이 아닌 다른 것을 취한다면 't'는 무엇입니까? 'CSA_hope' 모듈에 타이밍 정보가 포함되어있는 경우, 실행 가능한 최대 주파수를 나타냅니다. – Morgan

답변

1

다른 블록에서 시계의 정확한 가장자리에서 입력 신호를 변경하면 안됩니다.

시뮬레이션이 여전히 작동해야하지만 시간이 # 10 일 때 경쟁 조건이 있습니다. 먼저 클럭 에지가 변경되거나 입력 값이 변경되는 것이 결정적이지 않기 때문입니다.

# 5와 # 10에서 시계가 항상 전환되므로 모든 입력을 일정하지 않은 것으로 여러 번 입력하는 것이 가장 좋습니다 (# 11, # 41, # 91, 기타).

그러면 경쟁 조건이 없으며 파도를 볼 때 일어나는 일을 이해하는 것이 훨씬 쉬울 것입니다.