해결된 질문
작성
·
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에서 그래프가 멈췄습니다
네 i가 99까지 나오지 않고 o_valid가 0으로 떨어지는 모습을 확인할 수 없었습니다.