묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
안녕하세요 맛비님! BRAM에 관해서 질문하고 싶은 것이 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! 맛비님. 너무 유익한 강의 감사드립니다. 저가 이번 강의를 복습하면서 궁금한 점이 있는데요. 맛비님 블로그를 봤을 때 BRAM을 IP catalog에서 불러와서 쓰셨는데 강의에서는 직접 설계하셨습니다. IP에서 BRAM을 불러온 것과 직접 BRAM을 설계하는 차이가 뭔지 궁금합니다. 또 실제 설계함에 있어서 어느 방법을 더 많이 쓰는지 궁금합니다.
-
해결됨설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
MEM_SIZE 관련 질문
안녕하세요. 맛비님. default MEM_SIZE가 3840인 이유가 있나요? 갑자기 궁금증이 드는데 보통 메모리는 2의 몇승 되는 값?으로 정의되지 않나 싶어서요.
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
if 문과 case 문의 차이점에 관해 문의 드립니다.
fsm_test.v의 64행 Step 3 의 always block 에서 o_done 을 1로 셋하는 부분에 궁금한 점이 있습니다. 아래와 같이 if ..else 문을 사용해도 되는 것 같은데 case문을 사용한 것과 타이밍이나 사이즈 면에서 합성 결과가 차이가 나는지 궁금합니다. 시뮬레이션 결과는 같이 보여서요.. if (c_state == S_DONE) o_done <= 1; else o_done <= 0; if 문과 case문을 선택하는 것은 단지 설계자의 취향 차이 일까요?
-
해결됨설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
fsm 에서 next state 계산하는 always 블록 관련 질문 드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 맛비님. 먼저 글씨가 흐려서 죄송합니다.. 어떻게 바꾸는지 모르겠어요..ㅠㅠㅠ next state 계산?하는 always block에서 n_state = S_IDLE; n_state = S_RUN; Blocking 구문으로 작성되어 있는데요. n_state <= S_IDLE; n_state <= S_RUN; 이런식으로 Non-blocking 구문으로 작성하면 안되는 이유가 있나요? 제가 이해하기론 n_state 는 combinational 회로라 굳이 Non-blocking 구문으로 작성할 이유는 없다고 생각해요. clock이랑 동기화를 해줄 이유가 없어서..그런데 https://verilogguide.readthedocs.io/en/latest/verilog/fsm.html#verilog-edgedetector 위 링크에서 rising edge detector 예제를 푸는데, waveform이 next state 를 Non-blocking 구문으로 작성했을 때 예제에서 제공한 waveform이랑 같은 것을 확인할 수 있었습니다. 이상한 것은 예제에서는 next state가 Blocking 구문으로 작성되어 있다는 것이에요. 아래 그림은 위 링크 예제처럼 작성했을 때 waveform 차이입니다. 코드는 혹시나 제가 실수한 것이 있을까봐 올려둡니다. 죄송합니다. figure1. 링크 waveform figure2. 실습했을 때 waveform, mealy_tick과 moore_tick이 위 사진과 다르게 출력되는 것을 확인. 아래처럼 Blocking 구문을 전부 Non-blocking 구문으로 바꾸면 파형이 잘 나옵니다. figure3. Non-blocking 구문으로 수정한 후의 waveform. 내용이 너무 기네요. 정리해보겠습니다. 수업 외 다른 코드를 이용해 질문 드리는 것에 대해 사과드립니다. 그래도 최대한 코드 볼 필요 없이 질문 드려봅니다. <- 제 개인적인 생각입니다.. 제가 알고 싶은 것은 1. next state 계산에서 Blocking 구문으로 사용하는 이유가 제가 이해한 것이 맞는지 2. 제가 이해한 것이 맞다면 왜 이 예제는 Blocking 구문으로 작성하면 원하는 파형이 안 나오는 것인지 3. 추가로 지금 waveform을 보면 reset이 눌리기 전에 c_state와 n_state가 x로 나오는데, 만약 x로 나오지않고 0으로 나온다면 c_state와 n_state는 Latch로 된 것인지 알고싶습니다. 이상입니다. 감사합니다.
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
더 복잡한 회로에 관한 질문
안녕하세요 맛비님 ! 이번에 전자공학과 3학년으로 진학하는 대학생입니다. 드디어 심화편의 FSM까지 오게되었습니다. 핵심만 짚어드리는 강의가 쏙쏙 들어와 이해하기 쉬웠습니다. 질문 내용은 현업에서 설계하는 훨씬 더 복잡한 회로를 FSM을 이용하여 만든다고 할 때 (step 4이후부터는 core가 무엇인지에 따라 달라지겠지만) verilog code에 똑같이 step 1~3부분이 있다고 한다면, 실제로도 실습코드의 step 1~3부분과 어느정도 비슷한가요?! 세부족인 code내용들은 당연히 다르겠지만 큰 틀로 봤을때요 !! 또, IDLE, RUN, DONE이 3개의 state말고도 다른 state를 사용하여 만드는 경우도 있을까요?
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
clock gating 및 assign 구문 질문드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 1. clock gating 생성에 관한 질문 clock gating 생성 예제에서는 DUT에서 input i_clk input i_clock_en의 wire 타입의 입력과 output o_clk을 이용해 assign o_clk = i_clk & i_clock_en 을 만들어 testbench에서 o_clk과 연결해줬는데, D F/F 실습 예제에서는 바로 testbench에서 reg타입의 clk, clk_enable을 이용해 wire clk_for_dut = clk && clk_enable로 만들어 DUT를 인스턴스 하는 과정에서 clk와 clk_for_dut를 연결해준걸로 이해했습니다. 질문 1 : clock gating 생성을 DUT와 testbecnh에서 모두 위의 다른 방식으로 생성하는것인가요 ? (예를들어 testbench에서만 해야된다? DUT에서만 해야된다?) 질문 2 : wire clk_for_dut = clk && clk_enable 이식에서 clk와 clk_enable 모두 reg타입인데 결과값이 wire로 나올 수 있나요 ? (&&의 논리연산 때문인가요? 0or1) 질문 3 : DUT를 인스턴스하는 과정에서 clk를 제외한 다른 값 (sync_reset, async_reset등)은 뒤의 괄호안에 reg 타입의 값이 들어가는데 .clk(clk_for_dut)에서는 clk_for_dut가 wire값인데 들어가도 되는지 질문드립니다. clk와 clk_enable이 이미 reg타입으로 값을 저장하고 있는 상태이고, 이 저장되는 값들의 관계에 의해서 clk_for_dut가 나오므로 단지 결과값을 연결하는 선(wire)으로 썻다. 이정도로 이해하면 될까요 ? 2. assign 구문에 대한 질문 D F/F 실습에서 마지막에서 이러한 구문이 나오는데 assign o_value_sync_reset = r_ff_sync_reset; assign o_value_async_reset = r_ff_async_reset; assign o_value_async_reset_n = r_ff_async_reset_n; assign o_value_mixed_reset = r_ff_mixed_reset; assign o_value_no_reset = r_ff_no_reset; 질문 4 :이렇게 reg 타입을 wire 타입 output과 연결시켜주는데 input, 또는 output으로 나오는 reg타입은 무조건 wire타입과 연결해줘야 하나요?(testbench 마지막에서 DUT를 인스턴스 하는 과정이랑 동일하다고 보면 될까요 ?) 그래서 testbench에서 인스턴스 할때 output값들이 매핑이 안되는 것인가요 ? (ex .o_value_sync_reset(빈칸) ) 또한 testbench에서 output값들이 wire로 선언이 되지 않은 이유인가요? 베릴로그를 오랜만에 접하다 보니 이런저런 귀찮은 질문 지송합니다. ㅠ
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
테스트벤치에 대해서 질문 하나 해도 될까요??
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 이번에 테스트벤치 작성하면서 궁금한 것이 있어서 질문드립니다. 먼저 i_run신호를 강사님께서 작성하신대로 이렇게 작성하고 시뮬레이션을 돌리면 다음과 같이 나옵니다. 근데 위의 코드를 이렇게 바꾸면 이렇게 나옵니다. 저 두개의 코드는 같은 의미가 아니였나요? 왜 이렇게 나오는지 궁금합니다. 또, 두개의 테스트 벤치중에서 어떤게 맞는 건지 궁금합니다.
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
질문이용~
testbench에서 if의 조건문에서 !== 의 연산자를 사용해주셨는데 !== 보통 잘 사용하지 않는 걸로 권장하는 걸로 알고 있습니다! 왜 굳이 != 말고 !==을 사용하셨는지 궁금합니다!
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
HW 가속기의 비밀인 Pipeline 을 이해해보자 (실습편)에서 질문 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 아직 베릴로그 구문에 익숙하지 않아 질문드립니다. @는 ~할때라는 의미로 받아드리고 있는데 다음 구문을 보면, 10 기다리고, 상승엣지일때 디스플레이를 띄운뒤 for문이 동작하기 시작하는데, for문이 시작하고 하강엣지 일때마다 i_valid, i_value값을 넣어준뒤 for문이 끝나고 다시 하강엣지에서 i_valid와i_value의 값을 0으로 해준다... 라는 뜻으로 받으드렸습니다. 중간에 @(posedge clk)은 무슨의미로 들어간 건가요..? 값을 하강엣지마다 넣어주는건데 이 구문이 필요가 있나요 ? 제가 이해한 대로 클럭 그림을 그려봤는데 이게 제대로 이해한게 맞는 건가요 ?? ================ 하강 엣지일때는 i_valid와 i_value에 값을 넣고 밑의 상승엣지일때는 i를 i+1로 바꾸는 용도인가요 ??
-
해결됨설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
always @(*) 문장 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 먼저 좋은 강의 정말 감사합니다. always @(*) 문장 관련해서 질문을 많이 받으셔서 스트레스 받으실 듯 하여 관련 답변이나 링크들 읽어 보았습니다. 제가 이해한 바로는 다음과 같은데 혹시 잘못 이해한 부분이 있는지 여쭤보고 싶습니다. - always @ 안에 기술되는 Type은 전부 reg여야 한다. (port는 예외) - always @(*)는 모든 입력이 포함된 것을 의미하므로 입력이 변경될 때 마다 항상 변경되는 것이기 때문에 모듈이 순차가 아닌 조합회로를 기술할 때 유용하다. - always @(*)은 Combinational Logic이고 reg Type을 선언하게 된다. - 하지만 reg라고 해서 전부 F/F인 것은 아니다. Always의 level sensitive로 사용하느냐(combinational Logic), Clock Edge Sensitive로 사용하느냐(Sequential Loigic)에 따라서 갈린다. - reg로 선언했다고 해서 전부 메모리가(Latch나 F/F) 되는 것은 아니지만 문법을 정확하게 지키지 않는다면 메모리가 되어 조합회로의 시그널 처리를 애매하게 만들 수 있으므로 유의하자. 조합회로를 설계하는데 Latch나 F/F의 형태로 합성되면 회로에 큰 문제가 생길 수 있다. VHDL을 2년전에 배우고 Verilog를 시작하게 되어 아직 지식이 많이 부족하다 보니 이런 질문 드리게 되었습니다. 감사합니다.
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
진짜진짜 마지막 부분에서 오류 발생
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 해야되는 모든 것들을 다 따라하고 이제 설레는 마음으로 Vivado & 를 쳤는데 실행은 안되고 오류가 발생했습니다 ㅠㅠㅠㅠ
-
해결됨설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
r_valid 관련 질문드립니다. (14장 Pipeline)
열심히 달았는데, 지우셔서 남겨둡니다 :) 안녕하세요. 제공 해 주신 power_of_8.v에서 r_value 신호를 이용하여 뭔가 체크하는 것이 없는 것 같습니다. 그럼 power_of_8 module의 output인 o_valid 신호를 다른 module에서 input으로 받아 o_power_of_8 신호의 데이터가 valid한지를 판단하기 위해서 사용하는 것인가요? ================================= 안녕하세요 :) r_value ? 라는 신호가 있었나요..? (검색하니까 없는데, r_valid 를 의미하는 거다 생각하고 답변드리겠습니다.) 현재 예제에서는, Throughtput 이 1 cycle 에 매번 Data 가 출력되도록 pipeline 되어 있습니다. 즉 input valid 의 파형을, output valid 가 그대로 따라가도록 되어 있다는 이야기 이고, r_valid 를 사용하지 않아도 ouput valid 에 맞춰서 Data 를 출력할 수 있는 모듈이 되겠습니다. 다만 o_power_of_8 신호가 유효한 시점의 Sync 를 맞춰줄 필요는 있습니다. 그래서 r_valid 를 사용했습니다. 추가로 더 적자면, ========================= 실제로 해당 모듈의 앞뒤로 Blackbox 모듈이 붙는다면, "Ready / Valid handshake" (이거는 FPGA 6,7,8 장? AXI 할때 나오는데) I/F 를 사용합니다. 이때는 r_valid 를 사용해서 설계할 것 같습니다. 질문과는 관련이 없을 수 있지만 handshake 를 사용하는 이유에 대해 적어드리자면, Blackbox 모듈은 말그대로 설계자가 알지 못하는 모듈이 설계모듈 앞 뒤에 사용되는 겁니다. 그 말은 언제 Data 를 주고 받을 수 있는지 모르구요. 이 모호성을 해소하기 위해서 handshake I/F 를 사용합니다. 구글링해서 공부해보세요. ========================= 그럼 power_of_8 module의 output인 o_valid 신호를 다른 module에서 input으로 받아 o_power_of_8 신호의 데이터가 valid한지를 판단하기 위해서 사용하는 것인가요? 네, power_of_8 모듈의 출력을 입력으로 사용하는 뒤의 모듈에게, 유효한(valid) Data 의 timing (시점) 을 알려주기 위해서 사용합니다. 즐공하세요 :)
-
해결됨설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
cnt_always 체크 관련 문의
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 코드를 보던 중 궁금증이 하나 생겨서 질문드립니다. counter_100.v 코드에서 43 라인의 cnt_always가 99인지를 체크하는 부분에서 "100 - 1"로 99를 만든 특별한 이유가 있을까요?
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
카운터 코드 질문 드립니다!
안녕하세요 강의 복습중에 의문이 생겨 질문드립니다. 강의에서 카운터를 설계할 때 reg [6:0] cnt를 선언하여 값을 받은 후 o_cnt에 할당을 해주는데 그냥 바로 o_cnt를 always문에 넣어서 값을 받으면 안되나요? 다른 이유가 있는것인지 궁금합니다.
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
read data의 1cycle delay에 대해 질문드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의 때, 아래 코드가 1cycle delay를 위한 코드라고 말씀하셨는데요. (B RAM의 Read data가 올라오는 타이밍이 1cycle 뒤이므로 해당 타이밍을 위해 1cycle delay가 필요하다는 점은 이해했습니다.) 왜 아래 코드가 1cycle delay가 되는지 이해를 못했습니다. ㅠㅠ 죄송하지만 설명부탁드립니다. // 1 cycle latency to sync mem output always @(posedge clk or negedge reset_n) begin if(!reset_n) begin r_valid <= 0; end else begin r_valid <= o_read; // read data end end assign o_valid = r_valid; assign o_mem_data = q0; // direct assign, bus Matbi recommends you to add a register for timing.
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
gcc 설치 과정 오류
안녕하세요 맛비님 영상과 가이드를 보면서 리눅스 환경을 설치중에 있습니다. 영상에서 13분 경 vivado bin 파일을 옮기고 나서 gcc 설치 커맨드를 입력했는데 첨부 사진과 같이 에러가 나오는 상황입니다. 이 경우에는 어떻게 해결을 하면 좋을 지 질문드립니다.
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
always문을 나누는 기준이 궁금합니다
always문을 사용하실 때 어떤 기준으로 always문을 나누시는지 궁금합니다. 가령 예를 들면 올려주신 chapter_11에 있는 count 코드를 보면 always 문 2개를 사용해서 모듈을 구성하셨고 그밖에 강의를 보면 다양하게 always문을 나누시는데 같은 동작을 하는 모듈을 always문 하나로 만들 수 있을텐데 나누시는 기준이 어떤건지 궁금합니다. 그리고 작성한 verilog 코드의 가독성을 높히기 위한 팁이나 관련 추천 서적이나 참고 자료가 있으실까요! 제가 이 부분에 대해서 부족한게 많아서 알려주신다면 앞으로 설계를 할 때 도움이 많이 될 것 같습니다. 감사합니다.
-
해결됨설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
level sensitive @에 대한 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 맛비님 안녕하세요. 질문 있습니다. Verilog 문법적인 부분은 왠만하면 따로 서칭하여 공부하고 있는데 오늘 실습 내용을 보니, @(posedge clk); 와 @(negedge clk);를 따로 사용하더라구요. 항상 always @() 이런 것만 봐와서 @가 always의 조건으로만 사용되는 줄로만 이해하고 있었습니다. 서칭을 해보니까 level sensitive라고하여 @ 뒤 괄호 안에 있는 신호가 변할 때 실행?된다고 나오더군요. 여기서 질문이 생깁니다. 1. 아래의 내용은 tb_power_of_8.v 내 49번째 줄부터 61번째 줄입니다. # 10 @(posedge clk); $display("Start! [%d]", $time); for(i=0; i<100; i = i+1) begin @(negedge clk); i_valid = 1; i_value = i; @(posedge clk); end @(negedge clk); i_valid = 0; i_value = 0; # 100 10ns 딜레이 후 @(posedge clk);이 나오는데 이걸 해석하면 clk의 rising edge가 발생되기 전까지 polling하는 것인가요? 2. 따로 Verilog HDL의 문법적인 스킬이라고 해야할까요? 뭔가 많은 모듈을 디자인을 하려면 문법적인 내용을 알고 있으면 유리할 것 같은데, 이런 것을 따로 공부하고 싶다면 전 강의에 추천해주신 책으로 공부하는 것이 좋을까요? 그런데 저는 책으로 공부하는 것보다 문제를 풀면서(모듈 설계) 공부를 하고 싶다는 생각이 더 드는데, 이를 보충해줄만한 참고 자료 같은 것이 있을까요?
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
simple bram ctrl 질문입니다 !
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 선생님! 맛비선생님의 BRAM Ctrl 설계를 학습하였는데 아래 맛비님의 코드 n_state = c_state를 case문 안에 default 문으로 넣었는데 시뮬레이션이 동작하지 않았습니다. 혹시 이유를 간략히 알 수 있을까요? always @(*) beginn_state = c_state;case (c_state)S_IDLE : if(i_run) n_state = S_WRITE;S_WRITE : if(is_write_done) n_state = S_READ; S_READ : if(is_read_done) n_state = S_DONE; S_DONE : n_state = S_IDLE;endcaseend
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
vaild신호 Concatenation문법 질문이요
Conacatenation 에서 비트를 묶는다는게 (reset) r_vaild=0,0,0, i_vaild=0 (posedge clk) r_vaild[1:0]=0,0 + i_vaild=1 -> r_vaild=[0,0,1] o_vaild=r_vaild[2]=0 (posedge clk) r_vaild[1:0]=0,1 + i_vaild=1 -> r_vaild=[0,1,1] o_vaild=r_vaild[2]=0 (posedge clk) r_vaild[1:0]=1,1 + i_vaild=1 -> r_vaild=[1,1,1] o_vaild=r_vaild[2]=1 . . . 요런 연산을 하는건가요..?