묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제
대기큐, 준비큐
혹시 대기큐나 준비큐의 경우 물리적인 디바이스에 존재하는 공간인가요? 아니면 메모리 한쪽을 대기큐, 준비큐로 사용하는 건가요?
-
해결됨독하게 시작하는 C 프로그래밍
%d와 %d 사이에 공백이 없다는 점에 주의
문자, 정수 입력 개행문자 제거 부분입니다.scanf_s("%d %d", &x, &y);scanf_s("%d%d", &x, &y);음 이게 공백이 있든 없든 둘다 똑같이 동작하는데 무슨 의미가 있는거죠??
-
해결됨독하게 시작하는 C 프로그래밍
24년 8월 기준 비주얼 스튜디오 2019 버전 다운로드 방법
C#,C++ 관련 코드를 공부하기 위해서 비주얼 스튜디오 2019 버전을 다운로드 하려고 하는데다운르도 홈페이지 들어가니깐 community 버전 다운로드 버튼이 활성화가 되어있지 않던데혹시 다른 방법 아시는 분들 있는지 싶어서 글 작성해 봅니다 !!! 부탁드리겠습니다 ㅠㅠ
-
해결됨디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기
16강 질문
1) Area가 클수록 Cost가 비싸고 따라서 Area가 크면 용량이 작다고 설명하셨습니다.먼저 Area와 용량의 관계에서 "Area가 크다는 것은 각 메모리 Cell의 크기가 크다는 것이고 따라서 더 적은 수의 Cell을 넣을 수 있어 용량이 적음" 으로 이해했고, Area와 Cost의 관계는 Area가 클수록 공정에서 비용이 들어 Cost가 비싼것으로 이해했습니다 하지만 결론적으로 Area와 용량이 무조건적으로 반비례하는 것에 대한 이해가 잘 되지 않습니다. 2) 0이 저장된 상태에서 1을 WRITE→ 우측 인버터의 출력부분에 0이 저장되어 있을 때, 여기서 WL에 1을 주고 BL에 1을 주면 BL과 인버터가 short되면서 1과 0이 만나게 된다. 이때 BL의 신호 1은 우측 인버터 부분 신호 0이 있으므로 충전되지 않은(또는 매우 적게 충전된) Parastic Cap을 충전시키게 된다. 따라서 상태를 바꾸지 못 할수도 있는데, 이는 그저 BL의 신호 세기를 충분히 높혀주면 되는 부분이다. 라고 이해했는데 맞을까요??(pdf의 블로그에 들어가보니 접지로 BL의 신호가 흘러서 상태를 바꾸지 못할수도 있다고 되어있어서요 !!)
-
해결됨디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기
ASIC에서 SRAM에 관한 질문입니다.
안녕하세요, 정성이 느껴지는 강의를 제공해 주심에 감사드립니다. 컴퓨터 구조의 메모리 계층 구조와 Verilog로 SRAM 모델링하기 강의에서 궁금증이 생겨 질문 드립니다. ASIC 칩을 찍어내는 상황이라는 가정을 하고, SRAM의 DEPTH를 2의 지수가 아닌 수(예를 들면 1021)로 지정하면, 실제 칩에는 DEPTH가 1021인 SRAM이 올라가나요? 아니면 1024짜리 SRAM이 올라가나요? 파운드리마다 다른가요? 실제 ASIC 칩에 DEPTH가 1021인 SRAM이 올라간다고 가정한다면, 주소의 bitwidth는 10-bit이므로 1022번이나 1023번 주소처럼 잘못된 주소에 접근할 가능성이 있습니다. 그렇기 때문에 이를 막는 로직이 추가로 필요할 것이라고 생각이 드는데, 이때 발생하는 overhead를 고려하는 것과 그냥 DEPTH가 1024인 SRAM을 올려버리는 것을 PPA 관점으로 비교할 수 있는 방법이 있을까요? 3.parameter로 선언된 변수를 비교 대상으로 삼아도 ASIC에서 아무 문제 없나요? 가령, if (addr > DEPTH) 처럼요!
-
해결됨디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기
강의자료
수업하시는 ppt 자료는 혹시 어디서 확인 가능할까요 ?
-
해결됨디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기
cache 코드 관련 추가 질문드립니다.
한 회차에서 많은 너무 많은 질문을 드리는 것 같네요... 한번에 질문 드려야 하는데 볼때마다 새롭게 궁금하는 점이 생겨 또 질문드립니다...always @(posedge clk, negedge rstn)if (!rstn) cc_re_d <= 0;else cc_re_d <= cc_re; 위 코드의 경우 Cache에 read enable 하는 변수에 해당하는 것 같습니다. cc_re와 cc_re_d를 별도로 변수를 초기화 하고, clk 신호에 맞게 동기화를 하는 이유를 잘모르겠습니다. (제가 생각한 내용은 cc_re의 경우 i_cpu_req 신호에 비동기로 값을 변경하고, 해당 값을 clk 동기화 신호에 맞게 cc_re_d에 넣게되면, clk 주기 사이에 cc_re의 값이 변경되어도 cc_re_d의 값은 clk가 주기가 오기전까지 값을 유지하게 되는 상황인데 굳이 cc_re의 경우에만(추가로는 mem_we_d도 마찬가지) 이런식으로 구성한 이유를 잘모르겠습니다.)+ 추가로 찾아보니 메타스테이블 상태를 방지하기 위함 -레벨 트리거(cc_re가 그대로 전달될 경우) 신호가 엣지 트리거(다른 always @문에 사용되는 구문들) 상태와 겹치는 상태에서 불안정한 신호를 전달하기 때문이라는데, (레벨 트리거 신호를 엣지 트리거 상태로 변경하기 위함인가요?) 이게 맞는 내용일까요? => 그렇다면 다른 레벨 트리거 변수들은 위와 같이 동기화 신호로 안바꿔주는 이유가 궁금합니다...)
-
해결됨디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기
dual port ram 설계 코드 질문
module dpsram #( parameter DEPTH=8, parameter WIDTH=32, parameter DEPTH_LOG=$clog2(DEPTH) )( input clk, input [WIDTH-1:0] din_a, input [WIDTH-1:0] din_b, input [DEPTH_LOG-1:0] addr_a, input cs_a, input we_a, input [DEPTH_LOG-1:0] addr_b, input cs_b, input we_b, output reg [WIDTH-1:0] dout_a, output reg [WIDTH-1:0] dout_b ); reg [WIDTH-1:0] mem[DEPTH-1:0]; initial begin for(int i=0;i<DEPTH;i++) mem[i]=0; end always@(posedge clk) begin //write if(we_a && cs_a) mem[addr_a] <= din_a; if(we_b && cs_b) mem[addr_b] <= din_b; end always@(posedge clk) begin //read if(~we_a && cs_a) dout_a <= mem[addr_a]; if(~we_b && cs_b) dout_b <= mem[addr_b]; end endmodule위와같이 dpsram코드를 짰습니다. 예제 코드와는 다르게 저는 write와 read를 각각 나눠서 always block을 구성했는데 이렇게 짜면 다르게 동작하나요? RTL 뷰어로 보니 아래와 같이 복잡하게 나와서 질문드립니다.
-
해결됨개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제
PID 관련 질문입니다!
[추가] 파이썬으로 스레드 다루기이 강의에서 PID값이 프로세스를 실행할 때마다 달라지는 걸 볼 수 있는데 이유가 궁금합니다.동일한 프로세스를 반복해서 실행한다고 이해했는데, 이러면 고유한 번호(동일한 번호)가 출력되어야 하는 거 아닌가요?
-
해결됨디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기
cache 코드 관련 질문드립니다!
always @(posedge i_clk, negedge i_rstn) begin if(!i_rstn) r_wb_mem <= 0; else if(w_cpu_we) r_wb_mem[w_cc_wa] <= 1; else if(w_mem_re) r_wb_mem[w_cc_wa] <= 0; else if(w_mem_we) r_wb_mem[w_cc_wa] <= i_cpu_write; end위 코드의 경우 별도의 설명이 없었던 것 같습니다.코드를 분석하는 중 궁금한 점이 몇가지 생겨서 질문 드립니다.cpu_we이 1인 경우 CPU에서 (읽기를 통해 값을 비교하여 바꾸는 작업이 아닌) 쓰기 작업에 대한 요청을 보냈기 때문에 Main Memory에 값을 쓰기 위한 wb이 반드시 1로 되는게 맞는건지 궁금합니다.mem_re가 1인 경우 wb이 0이 되는 것이 헷갈립니다. 제가 이해한 Write Back은 쓰기 Main Memory에 데이터를 저장하는 것이기 때문에 mem_re 즉, 읽기 요청이 왔을 때 쓰는 행위가 같이 일어나면 안되는 것이라서 그런것인지 궁금합니다. (추가로 다른 이유가 있는지 궁금합니다.)mem_we가 1인 경우 memory에 Data를 써야하기 때문에 i_cpu_wirte에 값을 전달 받는 것이 아니라 1이 되어야 하는게 아닌지 궁금합니다.(i_cpu_write가 0인데 mem_we가 1인 상태가 궁금합니다. => 그냥 메모리에 쓸 준비가 되어 있는 상태에서 i_cpu_write 요청이 들어오면 그때 wb을 1로 만들겠다는 의미가 맞는지 궁금합니다.)아직 해석이 완벽하지 않아 내용 정리 및 전달이 미흡한점 죄송합니다.
-
해결됨독하게 시작하는 C 프로그래밍
동적 할당 메모리 질문
안녕하세요! 현재 강사님의 동적 할당 메모리 강의에서 아래 예제 소스코드를 파헤쳐보고 있는데요! #include <stdio.h> #include <stdlib.h> int main(void) { int* pList = NULL; pList = (int*)malloc(sizeof(int) * 3); pList[0] = 10; pList[1] = 20; pList[2] = 30; for (int i = 0; i < 3; ++i) { printf("%d\n", pList[i]); } free(pList); return 0; }그런데 디버그 모드로 실행하면서 메모리 뷰를 보고 있는데, 잘 이해가 되지 않는 지점이 있어 질문드립니다.(제가 개인적으로 MacOS를 사용해서 CLion 이라는 IDE를 쓰긴하는데, 강의 속 visual studio 처럼 메모리 뷰를 보는 기능은 동일하게 제공해주어서 제가 사용하는 IDE 첨부사진인 점 양해 부탁드리겠습니다 (__) ) 우선 break point를 아래처럼 라인 바이 라인으로 설정한 후 하나씩 실행해보고 있는데요. 한 step 씩 사진을 첨부하면서 설명을 하겠습니다.1.정수 포인터 변수인 pList 에 주소 연산자(&)을 써서 "정수 포인터 변수의 메모리 주소"를 확인 => 64비트 운영체제 컴퓨터에서 포인터 변수는 8바이트(64비트) 크기를 차지하기에 이것은 이해가 됩니다2.정수 포인터 변수인 pList를 메모리 윈도우에서 확인=> 이 부분이 명확히 잘 이해가 가지 않습니다. 일단 pList를 메모리 윈도우에 입력했을 때 pList가 '정수' 타입으로 선언했기 때문에 사진 속 초록색 영역이 4바이트(32비트) 크기인 것은 알겠는데, 초록색 영역에 들어있는 "ff c3 00 d1" 은 의미가 무엇인가요..? 사실 근본적으로 pList가 정수 포인터 변수인 것은 알겠는데, 메모리 윈도우에 pList 를 입력했을 때랑 &pList 입력했을 때의 차이가 명확하게 무엇인지 스스로에게 설명을 못하겠습니다..3.다음 break point로 한 step 실행한 뒤, pList에 주소 연산자(&)를 써서 메모리 윈도우를 확인=> 소스코드에서 pList에 NULL을 할당했기 때문에 아래 사진 속 메모리 윈도우에서 빨간색으로 변한 영역이 0으로 변한 것은 이해가 갑니다.4. 3번 단계에서 메모리 윈도우에서 pList를 입력한 후 확인=> 이 부분도 잘 모르겠습니다. pList를 메모리 윈도우에 입력하니까 failed to read memory 메세지가 뜨면서 메모리를 읽지 못한다는 문제가 발생했는데, 왜 읽지 못하는 것인지.. 이해가 가질 않습니다.5. 다음 break point로 한 step 실행한 뒤 pList를 메모리 윈도우에 입력한 후 확인=> 소스코드에서 malloc() 함수가 정의되어 있는 라인이 실행된 후에야 4번에서 발생한 문제가 사라지더라구요. 4번에서 발생한 문제의 원인을 모르니 5번에서 왜 문제가 해결되었는지도 연쇄적으로 잘 이해가 가지 않네요..혹시 위 5개 단계에서 제가 질문한 부분에 대해 답변 가능하신지 여쭙습니다. 동일한 visual studio 환경이 아니라 죄송합니다 ㅠ 천천히 답변주세요! 기다리겠습니다 🙂
-
해결됨디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기
SRAM 코드 Delay 관련
SRAM 코드의 경우 posedge에서 memory에 값을 넣는 동시에 ad, din 값을 하나씩 커지게 동작 시키면 기능 합성에는 문제가 되지 않지만, Delay가 적용되면 값이 흐트러 질 수 있는거 아닌가요?(예를 들면 negedge에 값을 넣어준다던가 해야하는게 아닌가요?)
-
해결됨독하게 시작하는 C 프로그래밍
함수 이름의 메모리 주소
안녕하세요~ 강의 열심히 따라가다가 그동안 배워온 것들 복습을 진행중입니다. 그러다가 함수 관련해서 질문이 있는데요! 강의 속에서 함수를 정의하면 해당 함수의 이름에는 배열처럼 메모리 주소가 할당된다고 하셨는데요! 좀 더 자세히 살펴볼려고 디버그 모드로 정의된 함수 이름에 어떤 메모리 주소가 들어가 있는지 살펴보고 있었습니다. Q1. 그런데 특이하게 디버그 모드를 최초로 실행할 때부터 함수 이름에 메모리 주소가 일종의 쓰레기값..(사진 속에서는 16진수로 ff 값이 적혀있네요)으로 정의되어 있고 이후 코드 실행 step 을 계속 실행시켜도 별다른 값으로 업데이트가 되지 않더라구요. 그렇다는 것은 런타임에 들어가기 전부터 빌드 타임에 함수 이름에는 메모리 주소가 최초로 1번만 할당되고 런타임 때는 할당되지 않는 것으로 이해하면 될까요?(마치 size of 연산자처럼 컴파일 연산자 처럼요..비교가 좀 다를 수 있긴 합니다만..) Q2. 함수의 메모리 주소도 포인터를 이용해서 막 여기 저기 활용하는 사례도 많나요??(마치 문자열이나 다른 배열을 포인터로 활용하는 것처럼..) Q3. 그리고 어쨌건 최초로 변수를 선언하고 정의할 때 메모리가 할당되는 시점은 무조건 빌드 타임에 할당되는 것이죠? 그러면 런타임에 메모리가 할당되는 시점도 있나요..? 자꾸 헷갈리네요! 혹시 질문이 이해가 안가신다면 답글 달아주세요! 감사합니다 :)
-
해결됨디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기
test bench 작성 후 RTL 시뮬레이션
강의에서 소개되는 FA_4bit를 RTL 시뮬레이션 해보려고 하였으나 위와 같은 오류창이 계속 뜹니다. tb명은 FA4bit으로 하였습니다. 해결할 방법이 있을까요?
-
해결됨디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기
DRAM Flow 관련 질문
Precharge 상태가 왜 VDD와 동일한지 궁금합니다. 제 생각에는 0.5Vcc를 유지해야 하는게 아닌가 싶어서 질문을 드립니다.20:04초 그림을 보게되면 Precharge 상태에서 BL이 VDD와 동일하게 차 있는 것을 볼 수 있는데 이렇게 되면 Charge Sharing이 일어나게 되면 캐패시터에 Write되지 않은 상태(0.5Vcc)에서 무조건 전압이 높아지고, 센스 앰플에 의해 1의 신호가 전달되면 캐패시터의 값이 Write가 일어나지 않았는데도 1의 값을 저장하게 되는게 아닌가 싶어 질문 남깁니다.
-
해결됨독하게 시작하는 C 프로그래밍
쉬프트연산에서 궁금한점이 있습니다.
곱셈, 나눗셈 할 때 CPU가 비트를 왼쪽, 오른쪽으로 쉬프트연산을 하는건 이해가 됩니다.그런데 유효 비트자리수를 넘어가면 절삭이 되잖아요.절삭이 되면 사실상 데이터를 잃어버리게 되는것인데절삭이 될지 안될지 어떻게 미리 알고 곱셈, 나눗셈을 연산하나요?
-
해결됨독하게 시작하는 C 프로그래밍
unsigned short가 64KB 라는게 이해가 안됩니다.
"정수형" 강의의 5:45 쯤에 나오는 내용입니다.unsigned short는 표현범위가 0~65535인데용량으로 환산하면 64KB 라고 말씀하신 내용이이해가 안됩니다.65535는 (2의 16승 - 1) 이라서 16비트 용량인것 같은데 64KB용량이라고 하시니 헷갈립니다.만약 65535를 단순히 K단위로 환산하면 65K가 나오는데 이를 또 65K가 아닌 64KB라고 하시니... 제가 어느부분을 놓치고 잇는 건가요?
-
해결됨독하게 시작하는 C 프로그래밍
질문은 아니지만, VS가아닌 VScode를 통하여 메모리 보는법 공유해봅니다
강사님께서는 VS를 통하여 영상을 올리셨습니다만,많은 분들께서는 저처럼 VScode를 사용하고 있을거라 생각합니다 제가 서칭하여 얻은 결과가 도움이 될까하여 공유해봅니다혹시 문제가 된다면 글 내리겠습니다! @@ 아래 과정은 영상의 코드를 그대로 사용합니다-- 수정 --VScode Extension에서 MemoryView를 검색하여 다운영상의 예제코드, F5 클릭으로 디버깅 수행그러면 하단 터미널 레이아웃 목록에서, MEMORY 목록이 뜰겁니다 클릭해당 레이아웃 상단의 + 버튼을 클릭합니다영상에서처럼 변수 이름을 입력합니다 ( &test )( 변수일 경우 &변수이름 , 배열일 경우 배열이름 입력 )이어서 디버깅 수행하시면 메모리 값을 볼 수 있습니다저는 성공적으로 메모리값을 보고 있지만 혹시나 안되시는분들은 MemoryView Extension 관련해서 직접 찾아보길 바랍니다 :)
-
해결됨독하게 시작하는 C 프로그래밍
파일 플러싱에 관한 질문입니다!
파일 플러싱 => Output에만 적용=> 메모리에 담긴 파일이 어딘가로 흘러 내보내진다는 의미ex) Console 입/출력 => 장치 추상화 파일 CON의 구성요소 stdin, stdout는 각각 Buffer를 가지고 있음=> Process가 출력을 하면 Output Buffer에 출력할 내용이 쌓임 => Buffer가 비워지면서 Console에 출력 => 이 일련의 과정을 OS가 처리이 과정에서 OS가 할 일이 많아지면 Buffer에 쌓이는 속도가 느려질 수 있음(Buffering)이 때 빠르게 Buffer를 비워서 콘솔에 출력을 하고 싶을 때 fflush() 함수를 사용이렇게 정리 해봤는데 맞게 이해한 걸까요?
-
해결됨독하게 시작하는 C 프로그래밍
주소 지정연산자(&)와 간접지정 연산자(*) 간의 관계
안녕하세요! 강의 속에서 아래 코드를 설명해주시면서 ..printf("%s\n", &szBuffer[4]);printf("%s\n", &*(szBuffer + 4));주소 지정 연산자와 간접 지정 연산자가 서로 반대이기 때문에 두 개가 만나면 없어진(?)다 라고 하셨는데요!여기서 '서로 반대' 라는게 막 피부에 와닿게 잘 이해가 되지는 않네요.. 일단 그냥 암기해야 할까요..? 이 '서로 반대이다' 라는 뜻을 완벽히 이해한 것은 아닌데 다음 진도를 나가는 게 맞는 건가 싶어서요!