reg [n-1] 存储器名 [m-1:0];
reg [7:0] mema[255:0]; //定义了名为mema的存储器,该存储器有256个8位的存储器,该存储器的地址范围为0到255
宏定义如果在行末加了分号,会连分号一起进行置换
宏定义是用宏名简单的置换一个字符串,不做语法检查,仅在编译已被宏展开后的源程序时才报错。
`define sw_o 6‘b101011
`define beq_o 6‘b000100
`define lui_o 6‘b001111
else if(WE==1 && A3!=0) begin
reg_files[A3] <= WD;
end
ext_out <= {{16{1‘b0}}, ext_in[15:0]} ; //必须标明1‘b0
pc模块需要初始化。32‘h3000才是初始化PC为0x3000的正确写法。32为位数,针对bits。32‘h即表意8个十六进制数,如果写成8‘h3000会初始化为0。
仔细检查各指令的OpCode以及Funct码是否写对
由由底层到顶层debug
单步运行分段debug
针对错误输出找问题
仿真出现高阻值z代表并未连接到有效输入上,首先应考虑连线问题,仿真出现不定值x的情况时首先考虑初始化问题。
单个模块调试时,npc直接指定了固定值,因此没有查出bug
assign Equal = alu_Result == 0 ? 1 : 0;
//现在发现完全不用加一位,直接改alu_Control用beq的Zero输出完全一致。
always @(*) begin
case(alu_Control)
// others
`suffix : begin
for(i=0;alu_A[i]==0;i=i+1) begin
end
for(j=0;alu_B[j]==0;j=j+1) begin
end
alu_Result <= i - j;
end
endcase
end
always @(*) begin
NPC[1] <= others1_i ;Equal&bszeal_i;
NPC[0] <= others0_i
end
1.2 xor: 异或运算,不赘述。
1.3 lha: 当对应地址对应的半字数据为4的倍数时将该半字符号扩展并写入指定寄存器,否则将0写入指定的寄存器。
assign dout = (DM_mode == 2‘b00) ? DM_WD :
(DM_mode == 2‘b01 ) ? DM_WD_lb : // 预加指令中DM_mode == 2‘b01为对8bits操作
(DM_mode == 2‘b10 && dm_reg[address][1:0]==2‘b00) ? DM_WD_lha_low16 : //具体输出使用位拼接操作
(DM_mode == 2‘b10 && dm_reg[address][17:16]==2‘b00) ? DM_WD_lha_high16 : 32‘b0;
原文:https://www.cnblogs.com/Happy-Huan/p/14092007.html