인프런 커뮤니티 질문&답변

움직이는YM님의 프로필 이미지
움직이는YM

작성한 질문수

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

Pipeline에서 질문

해결된 질문

작성

·

179

1

 

`timescale 1ns / 1ps

module power_of_8(

    input clk,

    input reset_n,

input i_valid,

    input [31:0] i_value,

output o_valid,

    output [63:0] o_power_of_8

    );

/////// Type ////////

reg [2:0] r_valid;  

reg [63:0] r_power_of_2;  

reg [63:0] r_power_of_4;  

reg [63:0] r_power_of_8;  

wire [63:0] power_of_2;  

wire [63:0] power_of_4;  

wire [63:0] power_of_8;  

// flow of valid

always @(posedge clk or negedge reset_n) begin

    if(!reset_n) begin

r_valid <= 3'd0;

    end else begin

r_valid <= {r_valid[1:0], i_valid};

    end

end

// data buffer (f/f) 

always @(posedge clk or negedge reset_n) begin

    if(!reset_n) begin

r_power_of_2 <= 64'd0;

r_power_of_4 <= 64'd0;

r_power_of_8 <= 64'd0;

    end else begin

r_power_of_2 <= power_of_2;

r_power_of_4 <= power_of_4;

r_power_of_8 <= power_of_8;

    end

end

// Power Operation

assign power_of_2 = i_value * i_value;

assign power_of_4 = r_power_of_2 * r_power_of_2;

assign power_of_8 = r_power_of_4 * r_power_of_4;

assign o_valid = r_valid[2];

assign o_power_of_8 = r_power_of_8;

endmodule

==================================== 테스트벤치 ==============================

`timescale 1ns / 1ps

module tb_power_of_8;

reg clk , reset_n;

reg i_valid;

reg [31:0] i_value;

wire o_valid;

wire [63:0] o_power_of_8;

 

// clk gen

always

    #5 clk = ~clk;

integer i;

integer fd;

initial begin

//initialize value

$display("initialize value [%d]", $time);

    reset_n = 1;

    clk     = 0;

i_valid = 0;

i_value = 0;

fd = $fopen("rtl_v.txt","w"); 

// reset_n gen

$display("Reset! [%d]", $time);

# 10

    reset_n = 0;

# 10

    reset_n = 1;

# 10

@(posedge clk);

$display("Start! [%d]", $time);

for(i=0; i<100; i = i+1) begin

@(negedge clk);

i_valid = 1;

i_value = i;

@(posedge clk);

end

@(negedge clk);

i_valid = 0;

i_value = 0;

# 500

$display("Finish! [%d]", $time);

$fclose(fd);

$finish;

end

 

// file write

always @(posedge clk) begin

if(o_valid) begin

$fwrite(fd,"result = %0d\n", o_power_of_8);

end

end

// Call DUT

power_of_8 u_power_of_8(

    .clk (clk),

    .reset_n (reset_n),

.i_valid (i_valid),

    .i_value (i_value),

.o_valid (o_valid),

    .o_power_of_8 (o_power_of_8)

    );

endmodule

위 코드는 맛비님이 주신 코드입니다(테스트벤치에서는 #숫자만 바꾸고 나머지는 동일합니다)

해당 코드를 vivado에서 돌리면

아래와 같이 i_valid와 i 의 값이 99까지 나오지 않습니다

제가 아무리 테스트벤치에서 # 숫자를 조작해도 맛비님이 보여주신 것처럼 i가 99까지 돌지를 않는데 왜 그런지 궁금합니다

테스트벤치에서 # 숫자를 조작하지 않고 맛비님이 주신 오리지날 코드로 돌렸을 때는 i가 88에서 그래프가 멈췄습니다

답변 1

1

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

테스트벤치에서 # 숫자를 조작하지 않고 맛비님이 주신 오리지날 코드로 돌렸을 때는 i가 88에서 그래프가 멈췄습니다

제가 드린 코드가 99 까지 나오지 않는 다는 뜻인가요?

저는 나오는데, 처음부터 받아서 확인해보세요 :)

네 i가 99까지 나오지 않고 o_valid가 0으로 떨어지는 모습을 확인할 수 없었습니다.

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

영상에서 보셨다시피, 수정한게 없는데... (Test 한거 그대로 올립니다.)

같은 코드라는 가정이면, 이유는 잘... 모르겠..

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

다음 질문에 올리셨군요~

즐공하세요 :)

움직이는YM님의 프로필 이미지
움직이는YM

작성한 질문수

질문하기