CO_Pre
CO_Pre
Pre阶段小知识点总结
Logisim
感觉logisim阶段还是比较简单的,教程也比较详细,要提醒自己的就是一定要多用标签,还有分析电路很好用~~。
Verilog
最稳的算数右移
1 | $signed($signed(A)>>>B) |
位数扩展及拼接
1 | assign A = {16'h0000, B} |
这个“{}”可以看成一种操作(符),和 “+”、“-”没什么区别,都会产生一个结果。
串联运算符{a,b,c}用来将小向量串联起来创建一个更大的向量。串联中不允许使用不定尺寸的常量。如{1,2,3}是非法的,因为Verilog不知道他们的位宽。
还可以用{n{vec}}的形式来复制向量,如{6{a}}和{a,a,a,a,a,a}是一样的,同时注意两组大括号都是必须的,即{1’b1,6{1’b0}}是非法的,因为其中的6{1’b0}少了一组大括号,正确的写法是{1’b1,{6{1’b0}}}。这其实比较好理解,串联运算符{a,b,c}中的abc均为一个向量,{n{vec}}也代表了一个向量,因此{a,b,{n{c}}}也是一个向量
循环操作的语法
1 | //普通for循环: |
组合逻辑的构建
- 使用assign语句,搭配三目运算符
- 使用always@(*) 和 <=
- 尤其注意组合逻辑是随着周期还是assign
好用的casez
casez可以匹配形如4’bzzz1的向量,z表示无关位。
1 | 优先编码器 |
状态机标准写法:
Moore型
三段式写法:使用一个state用于存当前状态,使用一个next_state用于存下一状态。第一段用于写状态转换逻辑,第二段用于状态转移,第三段用于输出。
1 | reg state, next_state; |
Mealy型
仅仅第三段发生了改变,可使用{state,in}来做输出判断。
1 | //第三段(assign法) |
小tips:使用独热码可以迅速减少代码量
1 | //独热码基本模板(伪代码): |
MIPS
字符串
.ascii与.asciiz
.ascii不会在字符串后加上’\0’,而.asciiz会在字符串加’\0’。 两者均以字节为单位存储数据,这会对我们带来一些小麻烦,.asciiz之后分配的空间首地址有可能无法字对齐,因此我们在定义.ascii与.asciiz时尽量写在最后面
1 | #正确写法 |
大端存储和小端存储
小端存储听起来更正常一些:
LSB存储到低地址
伪指令(directives)
伪指令不会被编译成机器码,但却影响其他指令的汇编结果。
伪指令有点像变量分配
.data
用于预先存储数据的伪指令的开始标志, 就是在告诉Mars,我从这要开始变量的声明和分配了
branch和j能跳转多少
- 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的段内绝对地址.
常用的syscall
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 |
read
Service | Code in $v0 | Arguments |
---|---|---|
read integer | 5 | $v0 contains the num |
read a string | 8 | $a0: the address of input buffer $a1: max num of character to read |
read a character | 12 | $v0 contains the char |
万能的宏
宏就类似c语言的函数一样,巧妙复用可以达到事半功倍的效果,还能迅速减少代码量
Macro_Summary
1 | 1.输入整数 |
- Title: CO_Pre
- Author: Charles
- Created at : 2022-12-26 20:50:19
- Updated at : 2023-11-05 21:36:02
- Link: https://charles2530.github.io/2022/12/26/co-pre/
- License: This work is licensed under CC BY-NC-SA 4.0.