这次P1,让本菜鸡回味无穷。
我只做了前两个题
最后5分钟,给代码加了一个else单词,就AC了,真是太惊险了。
题目说明:
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了转了半天,浪费了很多时间)
然后不复杂的兜兜转转就能找到
还有一个要注意的就是,作为中间计数的cnt,
每次always@(*)后,
要清零,否则连续改变输入,cnt会一直加下去。
说实话,我看到第一题,觉得我这次挂定了,而且还是挂在for循环这么基础的地方,
真是流下了悔恨且不学无术的泪水
最后,没有想到,借助language templates
起死回生
题目已经分配好了status, 00-生,01-半熟,10-熟,11-失败
具体题目忘了,
输入有temp(温度temperature)、flip(炒到某个状态,这个人要把食物翻一面)
输出有status、need_flip(炒到某个状态,这个食物是否需要翻一面)
生到半熟温度够即可,
半熟到熟要且仅要翻面一次,
任何状态,温度一高,或不恰当的翻面,直接失败。
这个题重点在于,以前我们在课下完成的测试,全部都是单输入,
像字符串的检查,我们的注意力永远是那个char[7:0],
像格雷码,只要时钟来的时候看看那个En。
这道题,输入就是两个,细节上,和以往的逻辑不同。
首先,这个题目的描述比较混乱,这也是我记不下这题的原因,
其次,当一个题目的描述混乱时,我们知道,里面的逻辑特点,就是有相当多的特例,
或者说,到时候,写状态转移时,会写很多的A && B && C,
注意到了这个特点,写起状态转移就好一些。
最后还有一个need_flip,这是一个非status的端口。
我们在搭建逻辑时,
要看清楚除了status以外的端口,
是随着时钟周期来更新,还是组合逻辑。
(我管这个叫Mealy和Moore端口。。)
我相信,这是一个很重要的考点。
这就是大家喜闻乐见的字符串检查环节,注意力都在那个char[7:0]上。
题面:
1926.8.17
2000-10-27
2012/12/25
上面三个都是合法的日期格式
-
不能有前导零,08-17不合法
-
三种分隔符.-/,且必须保持一致
-
注意月份的天数,1~30,不考虑复杂情况
这题我没做,,我忘了可以做这题,,我一直在肝第二题。。
做完等签退才回过神来,记了记题目。
(抱歉,是我太弱了)
双是喜闻乐见的字符串检测环节。
输入char,当一个后缀满足用户名合法性,输出1,否则0
我记了题目,但是感觉不对劲,就写个大概吧:
[a-zA-Z]+[.]{1}[0-9]+
后缀对了就行
这次测试,主要三个重点,考倒了很多人:
-
for循环写法
-
状态机端口是随时钟还是assign
-
多输入下的状态转移逻辑,这个地方不会为难大家,只要分析并写出特判就好
大家不要放弃。。