inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Verilog Master Season 1 của 설계독학 (Tự học thiết kế) (Bước nhảy vọt trong sự nghiệp kỹ sư thiết kế kỹ thuật số hoàn thiện thông qua các bài toán kiểm tra lập trình thực tế)

[L1-P14] Xử lý song song (Parallel Processing): Tận dụng ưu điểm riêng của phần cứng để tối đa hóa tốc độ xử lý

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

43

seanok959237

17 câu hỏi đã được viết

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

Câu trả lời 2

0

ETA

안녕하세요 서윤님,

열심히 하시는군요!

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

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

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

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

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

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


0

seanok959237

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

communityai8509

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

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

  1. 초기화 문제:

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

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

    • always @(posedge clk) 블록 내부에서 data_out_valid 신호에 반응하여 데이터가 기록되는데, 이 조건이 늘 명확히 만족되는지 확인해주세요. 주파수 조건과 데이터 유효 신호가 맞춰져 있는지 살펴봐야 합니다.

아래는 관련 질문에 대한 링크로, 문제를 해결하는 데도 도움이 될 수 있습니다:
- Verilog - Common Mistakes

위 내용들을 확인하시고 코드 수정 후에 정상적으로 동작하는지 다시 시도해보세요. 만약 문제가 지속된다면, 각 단계에서 발생한 데이터를 기반으로 추가적인 디버깅을 진행하실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

uvm config db에 대해 궁금한 점이 있습니다.

0

11

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

346

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