L2_P08 SRAM 코드 리뷰 부탁드립니다.
35
投稿した質問数 4
`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로 만드셨는데
제가 구현한 방식과는 조금 달라서 리뷰 부탁드립니다.
감사합니다.
回答 2
0
안녕하세요 정회운님,
열심히 하시는 모습 너무 좋습니다!
코드 리뷰 드립니다.
제가 코드만 보고 말씀 드리는 거라 miss가 있을 수 있으니 제 설명이 잘못된 부분이 있다면 답글 부탁 드립니다.
1,2 부분에는 따로 커멘트 드릴 것 없이 깔끔합니다.
Output part에 대해서 만 몇 가지 의견 드립니다.
우선 메모리 I/F 의 경우 timing 문제에 민감하기때문에 f/f를 사용합니다. 그래서 모범 답안은 f/f를 사용한 것 이고요. 정회운님께서는 메모리 I/F 부분은 블로킹 으로 구현을 하셨네요.
우선 보기에 모든 case에 모든 신호들이 할당되어 보이지 않습니다. 즉 래치가 발생할 수도 있는데요. 그래서 case문 위에 ready, sram,_addr, sram_data_out, sram_ce_n, sram_we_n 의 디폴트 벨류를 적어 주시는 게 좋습니다.
IDLE 상태에 data_out, sram_data_out, sram_addr 같은 경우 F/F을 사용하지 않기때문에 입력이 그대로 할당되고 있죠? 현재 모듈이 서브 블럭 이라면 문제가 되지 않습니다. 다만 이 모듈이 메모리 인터페이스 컨트롤 모듈이니 타이밍에 민감한데 feedthrough(input->output without register)에 의해 타이밍이 안 좋게 나올 수 있습니다.
하지만 현재 구현 하신게 동작 상으로는 문제가 되지 않아 보입니다.
앞으로도 화이팅 입니다!
0
안녕하세요, 인프런 AI 인턴입니다.
정회운님의 질문에 답변을 드리겠습니다.
제시된 SRAM 컨트롤러 코드의 주요 흐름은 FSM(상태 기계)을 사용하여 제어된다는 점에서 잘 설계된 예입니다. 코드는 FPGA의 레지스터와 논리게이트를 통해 종속적인 상태를 전환하며 외부 SRAM에 대한 읽기/쓰기 요청을 처리합니다.
초기화 및 리셋:
- 리셋(
rst_n)이 비활성화 상태(0)일 때, 상태를 IDLE로 전환하는 부분은 잘 처리되었습니다. 이는 시스템이 초기화되고 모든 상태들이 기본값으로 설정되게 해 줍니다.
- 리셋(
상태 전환(FSM States):
IDLE,WRITE_REQ,READ_REQ,READ의 각 상태 별로 작동합니다.WRITE_REQ와READ_REQ의 상태를 통해 SRAM에 필요한 쓰기 요청과 읽기 요청을 제어합니다.
IDLE상태에서는ready신호를 1로 유지하여 시스템이 다음 작업을 받을 준비가 되었음을 나타냅니다.
출력 제어 및 데이터 처리:
WRITE_REQ상태에서는 주소와 데이터가 SRAM에 입력되고,READ_REQ상태에서는 읽기 시작을 명령합니다. 이때 신호sram_ce_n,sram_we_n의 제어가 올바르게 되어 있으며,READ상태에서 읽은 데이터를 출력하는data_out에 적절하게 바인딩합니다.
논리적 오류:
- 주의해야 할 부분은 상태 전환 시클이 대응하는 실제 하드웨어 동작 타임라인과 맞아야 한다는 것입니다. 리드/라이트 타이밍이 SRAM의 timing 요구 사항과 잘 맞는지 확인해야 합니다.
- 주의해야 할 부분은 상태 전환 시클이 대응하는 실제 하드웨어 동작 타임라인과 맞아야 한다는 것입니다. 리드/라이트 타이밍이 SRAM의 timing 요구 사항과 잘 맞는지 확인해야 합니다.
유사한 경우에 대한 기존 답변을 찾아본 결과, 비슷한 질문 및 코드 리뷰가 진행된 예시가 있었습니다. 아래에 링크로 공유드리니 참고하시기 바랍니다:
- BRAM 메모리 사이즈 질문 - BRAM 메모리에 관련된 코드 및 동작 분석
- rdma.v 코드 수정 필요성 제기 후 수정본 검토 요청입니다! - Verilog 코드를 통한 설계 및 검토 사례
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
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

