此文件旨在帮助掌握选择题以及基础语法
主要还是,,人太健忘了
学了Verilog忘了MIPS
学了MIPS忘了Verilog
(´-_-`)||
将二进制码转换为one-hot码,如:
00 -> 0001
01 -> 0010
10 -> 0100
11 -> 1000
和有符号无符号没什么关系,即不论是理解成带符号运算还是理解成无符号运算,都是同样的值。
如:
1001+0111,结果是0000。
理解成有符号的话,就是进位进没了;
理解为无符号,就是0111-0111=0000。(转自BUAA-Wander)
$signed($signed(A)>>>B)
assign A = {16'h0000, B}
这个“{}”可以看成一种操作(符),和 “+”、“-”没什么区别,都会产生一个结果。
integer i;
always @(vote) begin
sum = 3'b000;
for(i = 0; i <7; i = i + 1) begin
if(vote[i]) sum = sum + 1;
end
if(sum >= 3'd4) pass = 1'b1;
else pass = 1'b0;
end
-
使用assign语句,搭配三目运算符
-
使用always@(*) 和 <=
-
尤其注意组合逻辑是随着周期还是assign
小端存储听起来更正常一些:
LSB存储到低地址
伪指令不会被编译成机器码,但却影响其他指令的汇编结果。
伪指令有点像变量分配
.data
用于预先存储数据的伪指令的开始标志
就是在告诉Mars,我从这要开始变量的声明和分配了
-
branch 有16位的offset(imm),采用相对寻址的方式
首先,如果条件不成立,那么会有:
PC = PC + 4
如果条件成立,有:
PC = PC + 4*(imm)
由于指令是4字节对齐的,因此可支持的跳转范围实际上是2^18=256KB(相对PC的-128KB~+128KB)。
如果确定跳转目标地址在分支指令前后的128KB范围内,编译器就可以编码只生成一条简单的条件分支指令。
-128KB~+128KB,-32Kword~+32Kword
大约在三千条指令内跳转,所以一般来说,不会跳太远 -
j指令 MIPS指令中最小的操作码域占6位,剩下的26位(instr_index)用于跳转目标的编址。
PC = {PC[31:28]:instr_index:00}
OX0FFFFFFC是能跳转最多的
由于所有指令在内存中都是4字节对齐的,因此最低的2个比特位是无需存储的,这样实际可供寻址范围为2^28=256MB。
分支跳转地址被当做一个256MB的段内绝对地址,
if($v0 == XX) then ($a0/$v0 will XX)
Service | Code in $v0 | Arguments |
---|---|---|
print integer | 1 | $a0: the integer to print |
print string | 4 | $a0: the address of null-terminated string to print |
Service | Code in $v0 | Arguments |
---|---|---|
read integer | 5 | $v0 contains the num |
read a string | 9 | $a0: the address of input buffer $a1: max num of character to read |
read a character | 12 | $v0 contains the char |