1

real 데이터 형식을 사용하는 시스템 Verilog에서 부동 소수점 숫자를 사용하고 싶습니다. 다음 코드를 시도했지만 작동하지 않는 것 같습니다. 나는 2.500000을 기대하는 2.000000을 얻고 있습니다.Verilog의 부동 소수점 구분

모듈 :

module real_check(input [31:0]a, [31:0]b, 
        output real c); 
    assign c = a/b; 
endmodule 

테스트 벤치 :

module tb_real_check(); 

real c; 
reg[31:0] a, b; 
real_check dut(a, b, c); 

initial 
begin 

    a <= 5; 
    b <= 2; 
    #50; 
    $display("Answer : %f ", c); 

end 
endmodule 

답변

4

당신은 integer division을 다하고 있습니다. int/int (reg[31:0]/reg[31:0])을 계산할 때 결과는 정수입니다. 따라서 5/2을 계산하면 2.5이 잘 리면에서 2으로 바뀌어 부동 소수점 (real) 숫자가 2.000...으로 변환됩니다. 부동 소수점 나누기 (이 십진수를 버리지 않음)를 원할 경우 피연산자 (부동 소수점 & 제수)를 부동 소수점으로 사용해야합니다.

그래서, 코드를 해결하기 위해, 모듈은 입력으로 두 개의 부동 소수점 숫자를 취할 필요가있다 :

module real_check(input real a, real b, 
        output real c); 

을 그리고 당신의 테스트 케이스에, 당신은 부동 소수점 숫자로 ab를 선언해야합니다

real a, b; 
+0

특정 비트 부동 소수점을 원한다면 어떻게해야합니까? float point = 0.5를 원한다면 4 비트 너비가 필요하다. 4'b0100과 같은 것을 얻을 수 있습니까? 나는 Newton-Raphson division을위한 lookup table을 만들고 있습니다. 이 테이블은 D가 8 비트 2 진수이고 영역이 [0.5, 1] ​​인 128 개의 24 비트 값 X = 48/17 - 32/17 * D를 포함합니다. 내가 조회 테이블을 자동으로 생성하는 .sv 코드를 작성하는 데 어려움을 겪고 있습니다. –

+0

@ ShuaiyuJiang 당신은 지정된 정밀도를 가진 부동 소수점을 의미합니까? 그래서 32 비트의 정밀도 (단 정밀도) 대신에 4 비트가 있습니까? –

+0

죄송합니다, 질문을 간략하게하겠습니다. 나는 24 비트 출력 논리 a [23 : 0]과 a = 48/17 (예를 들어)를 원했다. 논리 유형을 사용하는 경우 나머지는 잘 렸기 때문에 대답은 2가됩니다. 내가 진술을 사용하려고 "진짜", 그리고 난 = 2.823529 ..... 가지고 질문은, 내가 실제로 이진 논리가 아닌 실제 번호를 원하는 거기에 어떤 방법을 내가 48/17? 맙소사, 내 영어 발표가 안좋아. 무슨 뜻인지 이해해 줄래? 싸구려 –