inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

설계독학's Verilog 마스터 Season 1 (실전 코딩 테스트 문제로 완성하는 디지털 설계 엔지니어의 커리어 도약)

[L1-P14] 병렬 프로세싱 (Parallel Processing) : 처리 속도를 극대화하는 하드웨어만의 장점 살리기

output.txt가 이상하게 나옵니다.

42

서윤

작성한 질문수 17

1

안녕하세요 🙂

병렬프로세서 관련 문제에 대해서 문의 드립니다.

모듈은

`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가

image.png

아래 처럼 나옵니다. 이유가 뭔가요?

==================

verilog-hdl system-verilog

답변 2

0

ETA

안녕하세요 서윤님,

열심히 하시는군요!

우선 서윤님께서 주신 코드를 그대로 복사해서 돌려보니 결과를 모범 답안과 동일하게 잘나왔습니다.

file = $fopen("answer.txt", "w");

주신 코드 그대로 output.txt가 아닌 answer.txt 파일을 확인했습니다.

answer.txt 파일을 확인해도 잘못되고 있다는 말씀이신가요?

그리고 혹시 테스트벤치를 수정하시고, 블럭의 포트 까지 변경하신 의도를 여쭤봐도 될까요?

답변 주시면 추가 답변드리겠습니다! 화이팅!


0

서윤

answer.txt 에서는

image.png

위에 이미지 처럼 나오는데 제가 짠 모듈의 코드를 테스트벤치에 돌리니까 질문에 올린 것과 같이 나와서 ./compare.sh를 돌리면 fail이 떠서 질문을 했습니다. 블럭의 포트 까지 변경하의도는 따로 없고 예전에 git.hub에 베릴로그 코드를 작성해서 올릴때 코드를 위에 처럼 작성해서 일관성을 위해서 그렇게 작성한 것입니다.

0

ETA

안녕하세요 서윤님

제가 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에서 인스턴스 포트만 변경해서 진행해보니

image.png

결과가 잘나옵니다.

위에 주신캡쳐의 output.txt 를 보면 time 이 45ns가 아닌 36ns가 찍혀있는데요.

제공드린 testbench를 그대로 사용해도 36ns가 찍히신다면 파형도 캡쳐 해서 공유 부탁 드립니다.


0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 서윤님, 문제를 공유해주셔서 감사합니다.

출력 파일 output.txt에서 기대한 데이터를 얻지 못하신 것 같습니다. 아래는 이와 관련된 몇 가지 가능성 및 해결책입니다.

  1. 초기화 문제:

    • 코드를 실행할 때, 초기 신호를 설정하는 동안 발생하는 문제로 인해 예상치 못한 출력이 발생할 수 있습니다. 코드에서 rst 신호가 #20에서 해제되고, 그 다음에서야 입출력 데이터가 업데이트됩니다. 시작 신호와 데이터 입력 순서를 면밀히 점검해주세요.
  2. 파일 열기/쓰기 문제:

    • 현재 코드에서 $fdisplay를 사용하여 파일에 데이터를 출력하고 있습니다. 이때, 파일 포인터 file을 제대로 열고 사용하고 있는지 확인이 필요합니다. 심플한 오류가 있을 수 있죠, 예를 들어 $fopen 함수의 올바른 사용 여부를 확인해보세요.
  3. 데이터 발생 조건:

    • 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