output.txt가 이상하게 나옵니다.
42
작성한 질문수 17
안녕하세요 🙂
병렬프로세서 관련 문제에 대해서 문의 드립니다.
모듈은
`timescale 1ns /1 ps
module parallel_processor #(
parameter DATA_WIDTH =8,
parameter NUM_PATHS = 4
)(
i_clk,
i_rst,
i_data_in,
i_data_valid,
o_data_out,
o_data_out_valid
);
input i_clk, i_rst;
input [ DATA_WIDTH-1 :0] i_data_in;
input i_data_valid;
output [(DATA_WIDTH * NUM_PATHS) -1 :0] o_data_out;
output o_data_out_valid;
reg [(DATA_WIDTH * NUM_PATHS) -1 :0] o_data_out;
reg o_data_out_valid;
always @(posedge i_clk or posedge i_rst) begin
if(i_rst) begin
o_data_out <= { (DATA_WIDTH * NUM_PATHS) {1'b0} };
o_data_out_valid <=1'b0;
end
else begin
o_data_out_valid <= i_data_valid;
if(i_data_valid) begin
o_data_out [7 :0] <= i_data_in+1'b1;
o_data_out [15:8] <= i_data_in-1'b1;
o_data_out [23:16] <= i_data_in ^8'hFF;
o_data_out [31:24] <= i_data_in & 8'hAA;
end
else o_data_out <= o_data_out;
end
end
endmodule
이렇게 작성하였고
테스트벤치도
module testbench;
// 파라미터 정의
parameter DATA_WIDTH = 8;
parameter NUM_PATHS = 4;
// 입력 신호 정의
reg clk;
reg rst;
reg [DATA_WIDTH-1:0] data_in;
reg data_valid;
integer file;
// 출력 신호 정의
wire [DATA_WIDTH*NUM_PATHS-1:0] data_out;
wire data_out_valid;
// DUT(Design Under Test) 인스턴스화
// ⚠ 주의: 만약 모듈(parallel_processor)의 포트 이름이 i_clk, i_rst 라면
// .i_clk(clk), .i_rst(rst) 로 꼭 맞춰주셔야 포트 에러가 안 납니다!
parallel_processor #(
.DATA_WIDTH(DATA_WIDTH),
.NUM_PATHS(NUM_PATHS)
) dut (
.i_clk(clk),
.i_rst(rst),
.i_data_in(data_in),
.i_data_valid(data_valid),
.o_data_out(data_out),
.o_data_out_valid(data_out_valid)
);
// 클럭 생성
always #5 clk = ~clk;
// 테스트 시나리오
initial begin
$timeformat(-9, 0, "ns", 6); // -9: ns, 0: decimal place, "ns": unit, 10:minimum field width
file = $fopen("answer.txt", "w");
// 초기화
clk = 0;
rst = 1;
data_in = 0;
data_valid = 0;
// 리셋 해제
#20 rst = 0;
// 테스트 케이스 1: 데이터 입력 0x55
#10 data_in = 8'h55;
data_valid = 1;
#10 data_valid = 0;
// 테스트 케이스 2: 데이터 입력 0xAA
#20 data_in = 8'hAA;
data_valid = 1;
#10 data_valid = 0;
// 테스트 케이스 3: 데이터 입력 0xFF
#20 data_in = 8'hFF;
data_valid = 1;
#10 data_valid = 0;
// 시뮬레이션 종료
#20
$fclose(file);
$finish;
end
// 결과 모니터링
always @(posedge clk) begin
if (data_out_valid) begin
$fdisplay(file,"Time: %0t, Input: %h, Output: %h", $time, data_in, data_out);
$fdisplay(file," Path 1: %h", data_out[DATA_WIDTH-1:0]);
$fdisplay(file," Path 2: %h", data_out[DATA_WIDTH*2-1:DATA_WIDTH]);
$fdisplay(file," Path 3: %h", data_out[DATA_WIDTH*3-1:DATA_WIDTH*2]);
$fdisplay(file," Path 4: %h", data_out[DATA_WIDTH*4-1:DATA_WIDTH*3]);
end
end
endmodule
이렇게 작성을 했습니다. 파형은 제대로 나오는데 output.txt가

아래 처럼 나옵니다. 이유가 뭔가요?
==================
답변 2
0
안녕하세요 서윤님,
열심히 하시는군요!
우선 서윤님께서 주신 코드를 그대로 복사해서 돌려보니 결과를 모범 답안과 동일하게 잘나왔습니다.
file = $fopen("answer.txt", "w");
주신 코드 그대로 output.txt가 아닌 answer.txt 파일을 확인했습니다.
answer.txt 파일을 확인해도 잘못되고 있다는 말씀이신가요?
그리고 혹시 테스트벤치를 수정하시고, 블럭의 포트 까지 변경하신 의도를 여쭤봐도 될까요?
답변 주시면 추가 답변드리겠습니다! 화이팅!
0
answer.txt 에서는

위에 이미지 처럼 나오는데 제가 짠 모듈의 코드를 테스트벤치에 돌리니까 질문에 올린 것과 같이 나와서 ./compare.sh를 돌리면 fail이 떠서 질문을 했습니다. 블럭의 포트 까지 변경하의도는 따로 없고 예전에 git.hub에 베릴로그 코드를 작성해서 올릴때 코드를 위에 처럼 작성해서 일관성을 위해서 그렇게 작성한 것입니다.
0
안녕하세요 서윤님
제가 Practical_interview_student/LEVEL_1/L1_P14_parallel_processor 에서 서윤님이 작성해주신 코드에
`timescale 1ns /1 ps
module parallel_processor #(
parameter DATA_WIDTH =8,
parameter NUM_PATHS = 4
)(
i_clk,
i_rst,
i_data_in,
i_data_valid,
o_data_out,
o_data_out_valid
);
input i_clk, i_rst;
input [ DATA_WIDTH-1 :0] i_data_in;
input i_data_valid;
output [(DATA_WIDTH * NUM_PATHS) -1 :0] o_data_out;
output o_data_out_valid;
reg [(DATA_WIDTH * NUM_PATHS) -1 :0] o_data_out;
reg o_data_out_valid;
always @(posedge i_clk or posedge i_rst) begin
if(i_rst) begin
o_data_out <= { (DATA_WIDTH * NUM_PATHS) {1'b0} };
o_data_out_valid <=1'b0;
end
else begin
o_data_out_valid <= i_data_valid;
if(i_data_valid) begin
o_data_out [7 :0] <= i_data_in+1'b1;
o_data_out [15:8] <= i_data_in-1'b1;
o_data_out [23:16] <= i_data_in ^8'hFF;
o_data_out [31:24] <= i_data_in & 8'hAA;
end
else o_data_out <= o_data_out;
end
end
endmodule제공드린 testbench에서 인스턴스 포트만 변경해서 진행해보니

결과가 잘나옵니다.
위에 주신캡쳐의 output.txt 를 보면 time 이 45ns가 아닌 36ns가 찍혀있는데요.
제공드린 testbench를 그대로 사용해도 36ns가 찍히신다면 파형도 캡쳐 해서 공유 부탁 드립니다.
0
안녕하세요, 인프런 AI 인턴입니다. 서윤님, 문제를 공유해주셔서 감사합니다.
출력 파일 output.txt에서 기대한 데이터를 얻지 못하신 것 같습니다. 아래는 이와 관련된 몇 가지 가능성 및 해결책입니다.
초기화 문제:
- 코드를 실행할 때, 초기 신호를 설정하는 동안 발생하는 문제로 인해 예상치 못한 출력이 발생할 수 있습니다. 코드에서
rst신호가#20에서 해제되고, 그 다음에서야 입출력 데이터가 업데이트됩니다. 시작 신호와 데이터 입력 순서를 면밀히 점검해주세요.
- 코드를 실행할 때, 초기 신호를 설정하는 동안 발생하는 문제로 인해 예상치 못한 출력이 발생할 수 있습니다. 코드에서
파일 열기/쓰기 문제:
- 현재 코드에서
$fdisplay를 사용하여 파일에 데이터를 출력하고 있습니다. 이때, 파일 포인터file을 제대로 열고 사용하고 있는지 확인이 필요합니다. 심플한 오류가 있을 수 있죠, 예를 들어$fopen함수의 올바른 사용 여부를 확인해보세요.
- 현재 코드에서
데이터 발생 조건:
always @(posedge clk)블록 내부에서data_out_valid신호에 반응하여 데이터가 기록되는데, 이 조건이 늘 명확히 만족되는지 확인해주세요. 주파수 조건과 데이터 유효 신호가 맞춰져 있는지 살펴봐야 합니다.
아래는 관련 질문에 대한 링크로, 문제를 해결하는 데도 도움이 될 수 있습니다:
- Verilog - Common Mistakes
위 내용들을 확인하시고 코드 수정 후에 정상적으로 동작하는지 다시 시도해보세요. 만약 문제가 지속된다면, 각 단계에서 발생한 데이터를 기반으로 추가적인 디버깅을 진행하실 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
uvm config db에 대해 궁금한 점이 있습니다.
0
7
1
이 강의 zboz7보드에서도 실행 가능한가요?
1
33
1
season 2 코딩테스트 강의에 대한 문의드립니다.
1
44
1
4:1먹스 구현방식에 대한 질문입니다.
1
39
2
Windows 기능 켜기
1
62
2
[L1-P02] 멀티플렉서 실전 결과 확인하는데 시간이 너무 걸립니다.
0
46
2
환경설정 문
2
97
2
환불 문의
1
145
2
[LV1_P4_REGISTER ] Non-Blocking
1
79
2
조건문에서 if 연속 사용
1
95
2
vivado 설치
2
132
1
LV1-21 Edge Detector 구현 방법 질문
1
107
1
학교에서 사용하는 툴
1
119
2
[L1-P16 clog2 with memory] clog2 function 질문
1
133
4
fsm 설계 방식에 대한 질문
1
110
2
Level0_P12_verification_testbench
1
96
2
mobaxterm 완전 삭제법
1
344
2
155ns 타이밍 이슈에 관한 궁금증(?)
1
112
2
build 오류
1
135
2
VIVADO 환경
1
133
2
코딩테스트
1
101
2
vscode 환경세팅 방법
2
230
2
L1-P12 인터럽트 제어 질문
2
121
2
L0-P03 design에 예제 코드가 그대로 실려있습니다.
2
97
2





