9.全体接続
いままでのモジュールを接続します。
このモジュールは論理合成TOPとなります。多くの信号接続で出やすいバグは、信号の名前が違うものです。たとえば、[1:0]ram_access_modeのところram_acess_mode
とやってしまうと1ビットのWIRE信号として解釈されFloatingの信号に接続することになり構文エラーにもならずつまらないところでDebug時間を食ってしまいことがあります。Veritakでは、明示的にWire宣言、Reg宣言されているものは、Scope Viewで色分け表示しています。暗黙Wire信号は色が付かないのですぐわかります。ハード記述を完成させたらScopeViewを一度見ておくといいでしょう。
RTLデバッグでは、外に出力信号をださなくともいいのですが、論理合成の際、賢い合成器は最適化により空の回路を生成してしまうので、回路動作で必須の信号を外にだしてこれを防ぎます。
//May.31.2004 `include "define.h" module H8(clock,sync_reset,MOUT,int_req2,int_req2_ack); input clock; input sync_reset; output [31:0] MOUT; input int_req2; output int_req2_ack; reg [7:0] int_vector=8'h20;//Interim May.31.2004 //ram_module wire ram_write; wire [1:0] ram_access_mode; wire [1:0] paddress_sel; wire data_address_latch; wire ram_data_in_sel; //ea_unit wire [3:0] ea_left_sel; wire [2:0] ea_right_sel; wire [3:0] ea_reg_address;//Jun.3.2004 wire [2:0] next_pc_offset; //alu wire [1:0] alu_left_sel; wire [3:0] alu_right_sel; wire [4:0] ope; wire imm_sel; wire v_clear,h_latch,n_latch,z_latch,v_latch,c_latch, ccr_all_write; wire [1:0] ccr_input_sel; wire [1:0] bus_state; wire [1:0] alu_access_mode; //reg_file wire [1:0] left_address_sel, right_address_sel; wire [2:0] write_address_sel; wire [1:0] reg_file_access_mode; wire reg_write; wire insel; wire [63:0] irword; wire [31:0] MOUT; wire [31:0] ALU_OUT; wire [23:0] EA,pc_reg; wire [31:0] RO_left,RO_right,left_address_out; wire [31:0] z_bus; wire [7:0] CCR; wire BCC_jmp; wire [7:0] IR1=irword[23+32:16+32]; wire [7:0] IR3=irword[23+32-16:16+32-16]; wire i_bit; wire [7:0] state; wire stop_state; wire [31:0] reg_out_for_mul_div; assign ea_reg_address=ea_left_sel==`PC_SEL ? IR1[3:0] : //Jun.3.2004 ea_left_sel==`ABS8_SEL ? IR3[3:0] : //Jun.3.2004 ea_left_sel==`IR1H_SEL_EA? IR1[7:4] :IR3[7:4];//May.31.2004 assign reg_out_for_mul_div=alu_access_mode == `LONG_ACCESS ? left_address_out : alu_access_mode == `WORD_ACCESS ? ( ea_reg_address[3] ==1'b1 ? {16'h0000,left_address_out[31:16]} : {16'h0000,left_address_out[15:0]} ) : ea_reg_address[3] ==1'b0 ? {24'h00_0000,left_address_out[15:8]} : {24'h00_0000,left_address_out[7:0]} ; //Note: register field mapping R0H =>0000, R0L=>1000 // always @(negedge clock) temp <=mul_div_dest_reg_out; decoder d1(clock,sync_reset, ram_write,ram_access_mode,data_address_latch, ram_data_in_sel,irword, ea_left_sel, ea_right_sel,next_pc_offset, alu_left_sel,alu_right_sel,ope,alu_access_mode,imm_sel,v_clear,h_latch,n_latch,z_latch,v_latch,c_latch, ccr_all_write,bus_state,ccr_input_sel,paddress_sel, left_address_sel, right_address_sel,write_address_sel,reg_file_access_mode, reg_write, insel,int_req2,int_req2_ack,i_bit,stop_state,state); /* decoder decoder1(clock,sync_reset, ram_write,ram_access_mode,data_address_latch, ram_data_in_sel,irword, ea_left_sel, ea_right_sel,next_pc_offset, alu_left_sel,alu_right_sel,ope,alu_access_mode,imm_sel,v_clear,h_latch,n_latch,z_latch,v_latch,c_latch, ccr_all_write,bus_state,ccr_input_sel,paddress_sel, left_address_sel, right_address_sel,write_address_sel,reg_file_access_mode, reg_write, insel,int_req2,int_req2_ack,i_bit,state,stop_state,state); */ h8_ram_module ram_module (.clock(clock),.sync_reset(sync_reset),.ram_write(ram_write), .paddress_sel(paddress_sel),.EA(EA),.data_address_latch(data_address_latch), .bcc_ea_sel(BCC_jmp),.IR(irword),.MOUT(MOUT),.access_mode(ram_access_mode), .ALU_OUT(z_bus),.ram_data_in_sel(ram_data_in_sel),.pc_reg(pc_reg),.next_pc_offset(next_pc_offset),.ea_left_sel(ea_left_sel),.CCR(CCR),.bus_state(bus_state)); ALU alu(.clock(clock),.sync_reset(sync_reset),.alu_left_sel(alu_left_sel), .alu_right_sel(alu_right_sel),.ope(ope),.imm_sel(imm_sel),.v_clear(v_clear), .h_latch(h_latch),.n_latch(n_latch),.z_latch(z_latch),.v_latch(v_latch),.c_latch(c_latch), .ccr_all_write(ccr_all_write),.access_mode(alu_access_mode), .RO_left(RO_left),.RO_right(RO_right),.irword(irword),.MOUT(MOUT), .bus_state(bus_state),.ccr_input_sel(ccr_input_sel),.z_bus(z_bus),.CCR(CCR),.BCC_jmp(BCC_jmp),.i_bit(i_bit),.stop_state(stop_state),.state(state), .mul_div_dest_reg(reg_out_for_mul_div),.mul_div_address3(ea_reg_address[3]));//Jun.3.2004 ea_unit EA_Unit(.clock(clock),.sync_reset(sync_reset),.EA(EA),.irword(irword),.ea_left_sel(ea_left_sel), .ea_right_sel(ea_right_sel), .RO_left(left_address_out),.alu_out(z_bus),.MOUT(MOUT),.pc_reg(pc_reg),.next_pc_offset(next_pc_offset),.int_vector(int_vector)); reg_file RegFile(.clock(clock),.sync_reset(sync_reset),.irhword(irword[63:32]), .left_address_sel(left_address_sel),.right_address_sel(right_address_sel), .write_address_sel(write_address_sel), .access_mode(reg_file_access_mode), .reg_write(reg_write),.alu_out(z_bus),.ea(EA), .reg_left_out(RO_left), .reg_right_out(RO_right),.insel(insel),.left_address_out(left_address_out),.ea_reg_address(ea_reg_address[2:0])); endmodule |