Skip to content

Latest commit

 

History

History
116 lines (83 loc) · 3.93 KB

File metadata and controls

116 lines (83 loc) · 3.93 KB

2020年P1课上评测回忆

写在前面的话

这次P1,让本菜鸡回味无穷。
我只做了前两个题
最后5分钟,给代码加了一个else单词,就AC了,真是太惊险了。

题1-组合逻辑-投票器

题目说明:
1001表示两个人投了票,
00111表示三个人投了票。
一个二进制数里,有几个1,就是几个人投了票。

按照权重,计算得分:
np(normal people),一票1分;
vip,一票4分;
vvip,一票16分。

信号名 方向 描述
np[31:0] I 31个普通人投票
vip[7:0] I 8个vip投票
vvip I 只有一个vvip
res O 大于等于32分,res为1

难点在哪?
很多人在温柔的课下测试里,压根没写过for循环!!
本人先是写了32+8个if-else,,然后行不通,tb仿真出来什么都没有
找了好久的帮助文档,,终于!
找到了for怎么写。。
首先呢,要找到帮助文档,,(我在help了转了半天,浪费了很多时间)
然后不复杂的兜兜转转就能找到 for_loop

还有一个要注意的就是,作为中间计数的cnt,
每次always@(*)后,
要清零,否则连续改变输入,cnt会一直加下去。

说实话,我看到第一题,觉得我这次挂定了,而且还是挂在for循环这么基础的地方,
真是流下了悔恨且不学无术的泪水
最后,没有想到,借助language templates
起死回生

题2-状态机-炒东西

题目已经分配好了status, 00-生,01-半熟,10-熟,11-失败

具体题目忘了, 输入有temp(温度temperature)、flip(炒到某个状态,这个人要把食物翻一面)
输出有status、need_flip(炒到某个状态,这个食物是否需要翻一面)

生到半熟温度够即可,
半熟到熟要且仅要翻面一次,
任何状态,温度一高,或不恰当的翻面,直接失败。

这个题重点在于,以前我们在课下完成的测试,全部都是单输入
像字符串的检查,我们的注意力永远是那个char[7:0],
像格雷码,只要时钟来的时候看看那个En。
这道题,输入就是两个,细节上,和以往的逻辑不同。

首先,这个题目的描述比较混乱,这也是我记不下这题的原因,
其次,当一个题目的描述混乱时,我们知道,里面的逻辑特点,就是有相当多的特例,
或者说,到时候,写状态转移时,会写很多的A && B && C
注意到了这个特点,写起状态转移就好一些。

最后还有一个need_flip,这是一个非status的端口。
我们在搭建逻辑时,
要看清楚除了status以外的端口,
是随着时钟周期来更新,还是组合逻辑。
(我管这个叫Mealy和Moore端口。。)
我相信,这是一个很重要的考点。

题3-状态机-日期合法性检查

这就是大家喜闻乐见的字符串检查环节,注意力都在那个char[7:0]上。
题面:
1926.8.17
2000-10-27
2012/12/25
上面三个都是合法的日期格式

  1. 不能有前导零,08-17不合法

  2. 三种分隔符.-/,且必须保持一致

  3. 注意月份的天数,1~30,不考虑复杂情况

这题我没做,,我忘了可以做这题,,我一直在肝第二题。。
做完等签退才回过神来,记了记题目。
(抱歉,是我太弱了)

题4-状态机-用户名合法性检查

双是喜闻乐见的字符串检测环节。

输入char,当一个后缀满足用户名合法性,输出1,否则0

我记了题目,但是感觉不对劲,就写个大概吧:
[a-zA-Z]+[.]{1}[0-9]+

后缀对了就行

最后的总结

这次测试,主要三个重点,考倒了很多人:

  1. for循环写法

  2. 状态机端口是随时钟还是assign

  3. 多输入下的状态转移逻辑,这个地方不会为难大家,只要分析并写出特判就好

大家不要放弃。。