설계독학's Verilog 마스터 Season 1 (실전 코딩 테스트 문제로 완성하는 디지털 설계 엔지니어의 커리어 도약)
에타님. 안녕하세요. 제가 많이 부족해서 매 강의마다 질문을 남기게 되네요... 메모리 리셋 관련된 질문입니다. [1. 질문 챕터] : L1-P16 clog2 [2. 질문 내용] : 메모리 rst에 초기화를 꼭 해야하나요? [3. 시도했던 내용, 그렇게 생각하는 이유] : 이 챕터에서 사용된 메모리는 BRAM으로 이해하고 있습니다. 두 가지 질문이 있는데요. BRAM은 따로 초기화해주지 않으면 쓰레기 값이 들어있나요? 그래서 따로 RTL에서 초기화 하고 싶은 값으로 초기화를 해줘야하나요? 만약 초기화를 따로 해줘야한다고 하면 보통 RTL 내에서 초기화를 하나요? Zynq와 같은 FPGA에서 PS로 초기화하는 방법을 사용해도 되나요? 이론에 있는 BRAM 코드를 schematic으로 보면 위처럼 나오는 반면, 모범 답안 코드의 schematic은 아래처럼 나옵니다. 초기화로 인해 로직이 추가된 것으로 보이는데 너무 비효율적으로 느껴져서 질문 드립니다.
설계독학's Verilog 마스터 Season 1 (실전 코딩 테스트 문제로 완성하는 디지털 설계 엔지니어의 커리어 도약)
에타님, 안녕하세요. 강의 잘 보고 있습니다. [1. 질문 챕터] : L1-P15 Priority encoder [2. 질문 내용] : RTL_ROM으로 합성되었다는 것이 어떤 의미인가요? AI 답변을 봤을 때는 LUT 형식으로 합성된 것으로 이해했습니다. 이 엔코더 예제로 예를 들면 아래와 같습니다. Address 0000, 0001 , Data 00 Address 0010, 0011, Data 01 Address 0100, ..., 0111, Data10 Address 1000, ..., 1111, Data 11 만약 그렇다고 하면 게이트로 합성되는 것보다 RTL_ROM으로 합성되는게 더 유리한건가요? [3. 시도했던 내용, 그렇게 생각하는 이유] : 일단 저는 Priority encoder를 아래처럼 구현했습니다. `timescale 1ns / 1ps module priority_encoder( input [3:0] in, output reg [1:0] out, output reg valid ); //TODO always @(*) begin valid = (in == 4'b0000) ? 1'b0:1'b1; if (in[3]) out = 2'b11; else if (in[2]) out = 2'b10; else if (in[1]) out = 2'b01; else out = 2'b00; end endmodule 그 후 schematic을 보는데 valid가 RTL_ROM으로 합성되어 있어요. 모범 답안 schematic이 궁금해서 봤는데 모범 답안 schematic은 두 로직 전부 RTL_ROM으로 합성되어 있습니다. ROM으로 합성되는게 유리하다고 판단한 이유는 게이트로 합성되면 발열(전력 소모)과 전송 지연 시간 등이 있기 때문입니다. 추가로 가끔 제가 구현한 예제가 시뮬레이션 실행에도 문제가 없고 결과도 PASS로 뜨는데 schematic을 실행했을 때 에러가 발생하는 경우가 있습니다. 이 경우 실제 합성 불가능해서 schematic 실행 시 에러가 발생하는 것인가요? L1-P13 Parallel processor 내용입니다. `timescale 1ns / 1ps module clock_divider #( parameter INPUT_FREQ = 100_000_000, // 입력 주파수 (Hz) parameter OUTPUT_FREQ = 25_000_000 // 출력 주파수 (Hz) )( input wire clk_in, // 입력 클럭 input wire rst_n, // 비동기 리셋 (액티브 로우) output reg clk_out // 출력 클럭 ); // 분주 비율 계산 localparam DIVIDE_RATIO = INPUT_FREQ / OUTPUT_FREQ; localparam COUNTER_WIDTH = $clog2(DIVIDE_RATIO); // 카운터 레지스터 reg [COUNTER_WIDTH-1:0] counter; //TODO always @(posedge clk_in or negedge rst_n) begin if (!rst_n) begin clk_out <= 1'b0; end else if (counter < (DIVIDE_RATIO / 2)) begin clk_out <= 1'b1; end else begin clk_out <= 1'b0; end end always @(posedge clk_in or negedge rst_n) begin if (!rst_n) begin counter <= 1'b0; end else begin counter <= counter + 'b1; end end endmodule 어디가 문제인지 찾지는 못했습니다.
설계독학's Verilog 마스터 Season 1 (실전 코딩 테스트 문제로 완성하는 디지털 설계 엔지니어의 커리어 도약)
안녕하세요. 에타님. 강의 잘 보고 있습니다. 감사합니다. 궁금한게 있습니다. [1. 질문 챕터] : Interrupt controller 문제 풀이 [2. 질문 내용] : 1. 새로운 인터럽트 요청 처리에서 interrupt_pending <= (interrupt_pending | interrupt_requests) & ~interrupt_mask; 를 사용한 이유. 2. 인터럽트 처리 완료 구문에서 interrupt_pending[current_interrupt] <= 0;를 쓴 이유. [3. 시도했던 내용, 그렇게 생각하는 이유] : interrupt_pending <= interrupt_requests & ~interrupt_mask; 와 무슨 차이가 있는지 이해가 잘 안됩니다. 굳이 0으로 내리지 않아도 interrupt_mask[current_interrupt] 비트가 1로 업데이트가 되어서 interrupt_pending <= (interrupt_pending | interrupt_requests) & ~interrupt_mask;로 처리가 될거라 생각하는데, 지우고 실행해보니까 기능에 오류가 있네요. 근데 무엇이 문제인지 이해가 안되서 질문 드립니다.
안녕하세요. test class의 constructor 부분을 보다가 궁금한 점이 있어 질문드립니다. 슬라이드 코드에서 아래와 같이 되어 있는데, this.din_if = this.din_if; this.dout_if = this.dout_if; 제가 이해한 바로는 function new() 의 argument로 전달받은 interface를 class 내부 member에 저장하려는 목적이라면, this.din_if = din_if; this.dout_if = dout_if; 처럼 작성되어야 할 것 같습니다. 혹시 슬라이드의 this.din_if = this.din_if; 부분은 오타인지, 아니면 제가 놓치고 있는 다른 의미가 있는지 확인 부탁드립니다.
안녕하세요. 이번에 Testbench와 UVM 강의를 신청하게 된 수강생입니다. 제가 본업이 있다보니 강의를 수강을 못하고 있는데, UVM 강의의 경우 유효기간이 존재하더라고요 혹시 추후에 기간을 늘려주실 계획이 있으실지 문의드립니다. 다른 하나는 SV 기초 강의는 신청하지 않았는데, 따로 수강하지 않고 바로 TB강의로 넘어가도 될지 문의드립니다. (NPU 설계 및 Gate 10,000개 미만 프로젝트에서 IO PAD Insertion부터 Synthesis, Scan, ATPG, DA와 STA를 해본 경험은 보유하고 있습니다.) 인프런에 로드맵 기능이 있는것으로 아는데 그걸 열어주시면 더 좋을 것 같습니다. 더욱 양질의 강의가 올라오길 기대하겠습니다. 감사합니다.
설계독학's Verilog 마스터 Season 1 (실전 코딩 테스트 문제로 완성하는 디지털 설계 엔지니어의 커리어 도약)
수강 전 문의를 드리고 싶어 불가피하게 여기에 질문글을 작성하게 되었습니다. 안녕하세요. 현재 대학원 석사과정에서 디지털 칩 설계를 하고 있는 학생입니다. 강의 수강 전에 여쭤보고 싶은 부분이 있어서 문의드립니다. Season2 코딩테스트에서 혹시 구비하고 있어야 할 FPGA가 따로 있을까요? 또 현재 칩 설계에 있어서 SPI, GPIO와 같이 칩 구동 전 데이터를 넣는 부분의 설계가 좀 어려워 AI의 도움을 받으면서 하고 있는데, 이 강의가 도움이 될 지 여쭤봅니다. 감사합니다.
설계독학's Verilog 마스터 Season 1 (실전 코딩 테스트 문제로 완성하는 디지털 설계 엔지니어의 커리어 도약)
안녕하세요 🙂 [1. 질문 챕터] : eg) 몇 장, 몇 분 몇 초 쯤. or 수강생 분들이 봤을 때 어디구나?! 할 수 있게 표기 부탁 드려요. [2. 질문 내용] : eg) 질문 내용을 자유롭게 작성해주시면 되겠습니다 🙂 [3. 시도했던 내용, 그렇게 생각하는 이유] : eg) 설치영상은 이렇게 시도했는데 안되더라 or 본인의 생각을 적어주세요. (실습 내용 중에 이해가 안되거나 잘못된 내용이 있는데, 이러 이러한 근거로 나는 이렇게 생각합니다.) ================ 다음 내용은 읽어보시고 지우시면 됩니다.================= 질문 내용을 작성해주실 때, 위의 3단계 로 제가 이해할 수 있게 작성해주시면 정확한 답변을 드릴 수 있을 것 같아요!! 현업자인지라 업무때문에 답변이 늦을 수 있습니다. (길어도 만 3일 안에는 꼭 답변드리려고 노력중입니다 ㅠㅠ) 강의에서 다룬 내용들의 질문들을 부탁드립니다!! (설치과정, 강의내용을 듣고 이해가 안되었던 부분들, 강의의 오류 등등) 이런 질문은 부담스러워요.. (답변거부해도 양해 부탁드려요) 개인 과제, 강의에서 다루지 않은 내용들의 궁금증 해소, 영상과 다른 접근방법 후 디버깅 요청, 고민 상담 등.. 글쓰기 에티튜드를 지켜주세요 (저 포함, 다른 수강생 분들이 함께보는 공간입니다.) 서로 예의를 지키며 존중하는 문화를 만들어가요. 질문글을 보고 내용을 이해할 수 있도록 남겨주시면 답변에 큰 도움이 될 것 같아요. (상세히 작성하면 더 좋아요! ) 먼저 유사한 질문이 있었는지 검색해보세요. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. ================== L0-P5번 문항에서 4to1 mux에서 모범 답안과 조금 다르게 전부 삼항 연산자로 할당해서 해결했는데 유의미한 차이가 있나요? 일단 schematic을 봤을 떈 4:1먹스 1개와 2:1먹스 3개로 구현되는 차이가 있었습니다.
설계독학's Verilog 마스터 Season 1 (실전 코딩 테스트 문제로 완성하는 디지털 설계 엔지니어의 커리어 도약)
안녕하세요 🙂 [1. 질문 챕터] : Vivado 2022.2 설치 영상 중 4분 25초 [2. 질문 내용] : Window Home 버전이라 Hyper-V 기능이 따로 없는데, 기능을 켜지 않아도 충분히 따라갈 수 있나요? [3. 시도했던 내용, 그렇게 생각하는 이유] :
설계독학's Verilog 마스터 Season 1 (실전 코딩 테스트 문제로 완성하는 디지털 설계 엔지니어의 커리어 도약)
안녕하세요 🙂 [L1-P02] 멀티플렉서 관련 질문이 있어서 문의 드립니다. 지금 vivado 2024.2를 다운로드 해서 사용하고 있습니다. 모듈을 작성하고 맞는지 ./build를 해보고 있는데 이게 시간이 너무 많이 걸려서 결과를 확인 못하고 있습니다. 1시간 넘게 돌아 갔는데도 결과를 확인 할 수 없습니다. 이게 정상인가요? 더 빠르게 확인 할 수 있는 방법이 없을까요? ==================
설계독학's Verilog 마스터 Season 2 (실전 코테 끝판왕: 고난도 문제로 완성하는 이직 프리패스)
`timescale 1ns / 1ps module data_avg ( input logic clk, input logic rstn, input logic [7:0] i_data, input logic i_valid, output logic [7:0] o_data, output logic o_valid ); //TODO logic [7:0] recent_data [0:3]; logic [9:0] sum; logic [1:0] valid_count; // store recent 4 data when i_valid == 1 always_ff @(posedge clk or negedge rstn) begin if(!rstn) begin for(integer i = 0; i < 4; i++) begin recent_data[i] <= 8'b0; end end else if(i_valid) begin // store data only when i_valid == 1 recent_data[0] <= i_data; for(integer i = 1; i < 4; i++) begin recent_data[i] <= recent_data[i-1]; end end else begin // remain data when i_valid == 0 recent_data[0:3] <= recent_data[0:3]; end end // o_valid is high when valid_count == 4 always_ff @(posedge clk or negedge rstn) begin if(!rstn) begin o_valid <= 1'b0; valid_count <= 2'b0; end else if(i_valid) begin if(valid_count == 3) begin o_valid <= 1'b1; end else if(valid_count < 3) begin o_valid <= 1'b0; valid_count <= valid_count + 1; end end else begin o_valid <= 1'b0; end end always_comb sum = recent_data[0] + recent_data[1] + recent_data[2] + recent_data[3]; always_comb o_data = o_valid ? ( sum[1] == 1 ? (sum[9:2] + 1) : sum[9:2] ) : 8'b0; endmodule 안녕하세요, 강의 잘 수강하고 있습니다. Q1. 작성하신 부분과 꽤 다르게 counter로 설계하였는데 간단하게 리뷰 부탁드리며 counter로 설계할 때와 fsm으로 설계할 때의 장단점이 궁금합니다. Q2. waveform에서 네번째 data가 들어온 바로 다음 rising edge 이후 valid와 average 값이 나와야 할 것 같은데 파형의 expected_data는 왜 한cycle이 더 delay돼서 나오는지 궁금합니다. 감사합니다.
설계독학's Verilog 마스터 Season 2 (실전 코테 끝판왕: 고난도 문제로 완성하는 이직 프리패스)
`timescale 1ns / 1ps module pattern_detector_no_fsm ( input logic clk, input logic rstn, input logic i_in, output logic o_flag ); //TODO logic [2:0] recent_data; logic before_flag; // store recent 4-bit always_ff @(posedge clk or negedge rstn) begin if(!rstn) begin recent_data <= 3'b0; end else begin recent_data[0] <= i_in; for(int i = 1; i < 3; i++) begin recent_data[i] <= recent_data[i-1]; end end end always_ff @(posedge clk or negedge rstn) begin if(!rstn) begin before_flag <= 1'b0; end else if(recent_data == 3'b101) begin before_flag <= 1'b1; end else begin before_flag <= 1'b0; end end always_comb o_flag = before_flag & i_in ? 1'b1 : 1'b0; endmodule module pattern_detector_fsm ( input logic clk, input logic rstn, input logic i_in, output logic o_flag ); //TODO `define INIT 1'b0 `define TARGET 1'b1 logic [2:0] recent_data; logic state; logic next_state; // store recent 4-bit always_ff @(posedge clk or negedge rstn) begin if(!rstn) begin recent_data <= 3'b0; end else begin recent_data[0] <= i_in; for(int i = 1; i < 3; i++) begin recent_data[i] <= recent_data[i-1]; end end end // FSM // 1. comb part always_comb begin case(state) `INIT : if(recent_data == 3'b101) begin next_state = `TARGET; end else begin next_state = `INIT; end `TARGET : if(recent_data == 3'b101) begin next_state = `TARGET; end else begin next_state = `INIT; end default : next_state = `INIT; endcase end // 2. seq part always_ff @(posedge clk or negedge rstn) begin if(!rstn) begin state <= `INIT; end else begin state <= next_state; end end // 3. output part always_comb o_flag = (state == `TARGET) & (i_in == 1'b1) ? 1'b1 : 1'b0; endmodule 안녕하세요, 코드 리뷰 원할 경우 남기면 리뷰 해주신다고 하셔서 질문 드립니다. 1) no fsm 1011이 됐을 때 다음 rising edge가 아닌 바로 1이 나와야 하기 때문에 101만 저장하여 비교한 후, 최종 출력에 i_in을 and 처리하여 101 + 1 일 경우만 o_flag가 나오도록 했습니다. 2) fsm 1과 비슷한 방법으로 하였는데 강의처럼 fsm의 input을 1이 아닌 3bit(101 target)로 하여, 상태를 2개로 축소시켜 작성하였습니다. 간단하게 리뷰 부탁드립니다!
설계독학's Verilog 마스터 Season 2 (실전 코테 끝판왕: 고난도 문제로 완성하는 이직 프리패스)
안녕하세요, 이번 강의 처음으로 수강하는 수강생인데 이전 버전의 환경 설정하는 영상이나 글 따라해도 계속 막힙니다. build시 자꾸 에러가 나오거나 vivado가 제대로 실행되지 않는데 이 부분이 해결이 되지 않습니다. 이전 가이드는 꽤 오래되었고, 무료 강의도 아니고 유료 강의인데 그냥 이전 영상을 참고하라고 할 게 아닌 해당 강의의 업로드 시점에서 최신화 된 환경 설정 영상/guide는 당연히 있어야된다고 생각합니다. 최신화 된 내용으로 자세한 guide를 부탁드립니다. 감사합니다.
설계독학's Verilog 마스터 Season 1 (실전 코딩 테스트 문제로 완성하는 디지털 설계 엔지니어의 커리어 도약)
안녕하세요 🙂 [1. 질문 챕터] : 01-03 환경 소개 및 설치 가이드 [2. 질문 내용] : 안녕하세요 이제 막 베릴로그를 배워보려고하는 입문자입니다. 환경설정에서 말씀하신 Ubuntu version으로 설치 하려고했는데 아래 그림 처럼 20년도 버전부터 24년도 버전까지 다운받을수없다고 뜨네요 다른 툴을 다운 받아서 진행하면 되는지 궁금해서 질문 남겨봅니다..! [3. 시도했던 내용, 그렇게 생각하는 이유] : eg) 설치영상은 이렇게 시도했는데 안되더라 or 본인의 생각을 적어주세요. (실습 내용 중에 이해가 안되거나 잘못된 내용이 있는데, 이러 이러한 근거로 나는 이렇게 생각합니다.) ==================
안녕하세요, 강의 수강 중 문의드립니다. * 저는 아직 이해가 부족한 부분이 많아 질문 내용을 AI의 도움을 받아 정리하였습니다. Zybo Z7-20 보드로 실습을 진행하던 중 UART 보드 검증 단계에서 문제가 발생했습니다. 강의에서는 IO Planning에서 uart_tx/rx 핀을 매핑한 후 PuTTY로 Loopback 테스트를 진행하셨는데, Zybo Z7-20은 온보드 USB-UART 브리지(FT2232HQ)가 PS MIO 핀에만 연결된 구조여서 순수 PL RTL 설계에서는 해당 핀에 접근이 불가능한 것으로 파악했습니다. (첨부 이미지 Figure 7.1 참고) 강의 기준 보드는 uart_tx/rx가 PL 핀에 직접 연결되어 XDC에서 바로 매핑이 가능한 것으로 보입니다. 제가 파악한 내용이 맞는지 확인 부탁드립니다. (AI는 USB-to-UART 변환 모듈을 별도 구매하면 해결 가능하다고 설명하고 있습니다. 다만 우선은 제가 파악한 내용이 맞는지 확인이 먼저라 생각되어 문의드리게 되었습니다. 확인 후 여유가 된다면 해당 방법도 시도해볼 예정입니다.) 감사합니다.
안녕하세요. queue 예제 관련 문의드립니다. int q[$] = {0,1,3,6}; int b[$] = {4,5}; 다음과 같이 초기값 선언 시 assignment pattern을 하지않는데 array type에서 이렇게 선언 시 systerm verilog 문법에서는 에러로 생각되는데 예제 의도에 대한 문의드립니다. 감사합니다. ] = {0,1,3,6}