--- tags: RISCV, 伴學松, 伴學松活動記錄 --- # 從0到有製作自己的CPU!! 第八周活動記錄 20220823 [TOC] # 直播紀錄連結 {%youtube dzTuhBPJfAQ%} ## 出席 - [x] KIM_WENG - [x] 名名 - [ ] chuan - [ ] bill503084699 - [ ] 楓糖 - [x] 謝祥辰 - [x] 黑貓 - [x] sixkwnp - [ ] Bonki - [x] ouo314 - [x] Willwho - [ ] GYLABA - [ ] mikuthebest - [x] Penquuin - [x] 葉子 - [ ] painCake - [x] EZ4ENCE - [ ] 頂漿汗腺 - [x] 角角 - [ ] adam chen # 討論內容 1. 做Jmp 2. 大改程式 # 本周作業 # 討論重點 1. PC線 2. 改程式 - 註解 pc next - pc 內改成 if(!reset) ```verilog= if(!reset) begin pc <= 0; end else if(jump_enable) begin pc <= jump_addr; end else begin pc <= pc + 3'h4; end ``` - pc.v 修改部分 ## 點子 / 撇步 - adder +4後,重新傳回PC,再傳給IM指令地址 - 目前打算把PC前的MUX寫在PC內 [name=第一組] - ![](https://i.imgur.com/zkWuSDy.png) [name=黑貓提供的想法] - ![](https://i.imgur.com/xm97Wv3.png) 送給ALU - ALU上面的MUX是給PC的,第二個MUX是留給imm的 [name=Kim Weng] - ![](https://i.imgur.com/jC3N1vU.png)示意圖 [name=黑貓] - pc(送入IM) 跟 pc+4(送回pc) 兩個都要輸出 [name=Willwho] - jmp_enable裡面,輸出的pc也是jump_addr [name=Willwho] - ![](https://i.imgur.com/RKfpl1u.png) [name=Kim Weng] - 00指令會被吃掉 [name=謝祥辰] - ![](https://i.imgur.com/ynmJ5dD.jpg) [name=Willwho] - ![](https://i.imgur.com/IXkgUMf.png) [name=謝祥辰] # 場外問題 - Q: 請問在always塊裡面如果有沒用到其中一個input會錯嗎? [name=Penquuin] ```verilog= module x( input a, input b, output c ); always@(*) begin case(b) 1'b0: c = a; 1'b1: c = b; // a沒被用到 endcase end endmodule ``` - Ans: 不會 - Q: 如果寫c=1'b0會出事嗎? [name=Penquuin] ``` - Ans: 應該不會 ``` # 場外分享 #### pc.v - [name=黑貓] ```verilog= module pc( input clk, input reset, input [31:0] pc_in, input jmp_enable, output [31:0] pc_next, output [31:0] pc ); always @(posedge clk or negedge reset) begin if(reset == 1'b1) begin pc <= 0; pc_next <= 3'h4; end else begin pc <= pc_in; pc_next <= pc_in + 3'h4; end end endmodule ``` - pc_in只有從jmp來 [name=Willwho] - 黑貓的想法是把mux分出來 [name=黑貓] #### pc.v - [name=Willwho] ![](https://i.imgur.com/0YqJh6n.png) ![](https://i.imgur.com/SlhVZOU.png) - 三個module分開 [name=Willwho] #### pc.v - [name=謝祥辰] ```verilog= module pc( input clk, input reset, input [31:0] jump_addr, input jmp_enable, output reg [31:0] pc_next, output reg [31:0] pc ); always @(posedge clk or negedge reset) begin if(reset == 1'b1) begin pc <= 0; pc_next <= 0; end else if(jmp_enable) begin pc_next<=jump_addr+3'b100; pc<=jump_addr; end else begin pc_next<=pc_next+3'b100; pc<=pc_next; end end endmodule ```