inflearn logo
강의

講義

知識共有

設計独学's Verilogマスター Season 2 (実践コーディングテストの決定版:高難易度問題で完成させる転職フリーパス)

L2_P08 SRAM 코드 리뷰 부탁드립니다.

35

xabc777x8689

投稿した質問数 4

1

`timescale 1ns / 1ps
module sync_sram_ctrl #(
    parameter ADDR_WIDTH = 8,
    parameter DATA_WIDTH = 16
)(
    input logic                     clk,
    input logic                     rst_n,
    input logic [ADDR_WIDTH-1:0]    addr,
    input logic [DATA_WIDTH-1:0]    data_in,
    output logic [DATA_WIDTH-1:0]   data_out,
    input logic                     rd_req,
    input logic                     wr_req,
    output logic                    ready,
    
    // SRAM I/F
    output logic [ADDR_WIDTH-1:0]   sram_addr,
    output logic [DATA_WIDTH-1:0]   sram_data_out,
    input logic [DATA_WIDTH-1:0]    sram_data_in,
    output logic sram_ce_n,
    output logic sram_we_n
);

    // FSM states
    localparam IDLE         = 2'd0;
    localparam WRITE_REQ    = 2'd1;
    localparam READ_REQ     = 2'd2;
    localparam READ         = 2'd3;

    logic [1:0] state, n_state;

    // 1. Comb part
    always_comb begin
        case(state)
        IDLE        :
            begin
                if(rd_req == 1) begin
                    n_state = READ_REQ;
                end
                else if(wr_req == 1) begin
                    n_state = WRITE_REQ;
                end
                else begin
                    n_state = IDLE;
                end
            end
        WRITE_REQ   :
            begin
                n_state = IDLE;
            end
        READ_REQ    :
            begin
                n_state = READ;
            end
        READ        :
            begin
                n_state = IDLE;
            end
        default     :
            begin
                n_state = IDLE;
            end
        endcase
    end

    // 2. Seq part
    always_ff @(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            state <= IDLE;
        end
        else begin
            state <= n_state;
        end
    end

    // 3. Output part
    always_comb begin
        case(state)
        IDLE        :
            begin
                ready = 1;
                sram_ce_n = 1;
                data_out = sram_data_in;
            end
        WRITE_REQ   : 
            begin
                ready = 0;
                sram_addr = addr;
                sram_data_out = data_in;
                sram_ce_n = 0;
                sram_we_n = 0;
            end
        READ_REQ    :
            begin
                ready = 0;
                sram_addr = addr;
                sram_ce_n = 0;
                sram_we_n = 1;
            end
        READ        : 
            begin
                ready = 0;
                sram_addr = addr;
                sram_ce_n = 1;
                sram_we_n = 1;
            end
        default     :
            begin
                ready = 1;
            end
        endcase
    end
endmodule

안녕하세요, 강의 잘 수강하고 있습니다.
우선 main 로직부분에서 f/f을 활용해서 초기화를 하셨고,
write, read state에서 바로 ce_n, we_n을 1로 만드셨는데
제가 구현한 방식과는 조금 달라서 리뷰 부탁드립니다.


감사합니다.

verilog-hdl fpga system-verilog rtl

回答 2

0

ETA

안녕하세요 정회운님,

열심히 하시는 모습 너무 좋습니다!

코드 리뷰 드립니다.

제가 코드만 보고 말씀 드리는 거라 miss가 있을 수 있으니 제 설명이 잘못된 부분이 있다면 답글 부탁 드립니다.


1,2 부분에는 따로 커멘트 드릴 것 없이 깔끔합니다.

Output part에 대해서 만 몇 가지 의견 드립니다.

우선 메모리 I/F 의 경우 timing 문제에 민감하기때문에 f/f를 사용합니다. 그래서 모범 답안은 f/f를 사용한 것 이고요. 정회운님께서는 메모리 I/F 부분은 블로킹 으로 구현을 하셨네요.

  1. 우선 보기에 모든 case에 모든 신호들이 할당되어 보이지 않습니다. 즉 래치가 발생할 수도 있는데요. 그래서 case문 위에 ready, sram,_addr, sram_data_out, sram_ce_n, sram_we_n 의 디폴트 벨류를 적어 주시는 게 좋습니다.

  2. IDLE 상태에 data_out, sram_data_out, sram_addr 같은 경우 F/F을 사용하지 않기때문에 입력이 그대로 할당되고 있죠? 현재 모듈이 서브 블럭 이라면 문제가 되지 않습니다. 다만 이 모듈이 메모리 인터페이스 컨트롤 모듈이니 타이밍에 민감한데 feedthrough(input->output without register)에 의해 타이밍이 안 좋게 나올 수 있습니다.

하지만 현재 구현 하신게 동작 상으로는 문제가 되지 않아 보입니다.

앞으로도 화이팅 입니다!


0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

정회운님의 질문에 답변을 드리겠습니다.

제시된 SRAM 컨트롤러 코드의 주요 흐름은 FSM(상태 기계)을 사용하여 제어된다는 점에서 잘 설계된 예입니다. 코드는 FPGA의 레지스터와 논리게이트를 통해 종속적인 상태를 전환하며 외부 SRAM에 대한 읽기/쓰기 요청을 처리합니다.

  1. 초기화 및 리셋:

    • 리셋(rst_n)이 비활성화 상태(0)일 때, 상태를 IDLE로 전환하는 부분은 잘 처리되었습니다. 이는 시스템이 초기화되고 모든 상태들이 기본값으로 설정되게 해 줍니다.
  2. 상태 전환(FSM States):

    • IDLE, WRITE_REQ, READ_REQ, READ의 각 상태 별로 작동합니다. WRITE_REQREAD_REQ의 상태를 통해 SRAM에 필요한 쓰기 요청과 읽기 요청을 제어합니다.
    • IDLE 상태에서는 ready 신호를 1로 유지하여 시스템이 다음 작업을 받을 준비가 되었음을 나타냅니다.
  3. 출력 제어 및 데이터 처리:

    • WRITE_REQ 상태에서는 주소와 데이터가 SRAM에 입력되고, READ_REQ 상태에서는 읽기 시작을 명령합니다. 이때 신호 sram_ce_n, sram_we_n의 제어가 올바르게 되어 있으며, READ 상태에서 읽은 데이터를 출력하는 data_out에 적절하게 바인딩합니다.
  4. 논리적 오류:

    • 주의해야 할 부분은 상태 전환 시클이 대응하는 실제 하드웨어 동작 타임라인과 맞아야 한다는 것입니다. 리드/라이트 타이밍이 SRAM의 timing 요구 사항과 잘 맞는지 확인해야 합니다.

유사한 경우에 대한 기존 답변을 찾아본 결과, 비슷한 질문 및 코드 리뷰가 진행된 예시가 있었습니다. 아래에 링크로 공유드리니 참고하시기 바랍니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

0

9

1

이 강의 zboz7보드에서도 실행 가능한가요?

1

33

1

강의자료 기한 연장 + 로드맵 문의

0

31

2

Chapter 16 FSM 관련 질문

1

42

2

강의 환경(linux) 관련 질문

1

49

2

강의자료 업로드 될까요

0

36

2

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

1

43

2

Arty Z10 관련 문의

1

46

2

season 2 코딩테스트 강의에 대한 문의드립니다.

1

44

1

4:1먹스 구현방식에 대한 질문입니다.

1

39

2

수강 순서 질문 있습니다

1

69

2

Windows 기능 켜기

1

62

2

cache에서 data miss가 나고 메모리에서 read data할때 이해가 안가는 신호가 있어서 질문 드립니다.

0

51

1

[L1-P02] 멀티플렉서 실전 결과 확인하는데 시간이 너무 걸립니다.

0

46

2

13장 파이프라인 질문 드립니다.

1

87

2

UART의 역할이 PC와 PS를 연결해 주는 역할로 알고 있습니다.

1

80

2

L2_P4 data_average 코드 리뷰 및 waveform 질문 드립니다.

1

66

2

Ubuntu 20.04.5 설치관련 문의드립니다

1

95

2

LV2-2 Patter Detector code review 부탁드립니다.

1

45

1

환경 설정하는 guide 최신화 부탁드립니다.

1

81

2

Arty A7-35T 구매 불가

0

58

2

git hub 404 error 도움 부탁드립니다.

1

66

2

LT스파이스 라이브러리 다운이 안됩니다.

0

67

2

어떤 방식으로 이 강의를 듣고 공부를 해야 하는지 고민 됩니다.

0

95

2