一道笔试题,大家来看看
always@(posedge clk or rst)
if(!rst)
out<=8'h00;
else
out<=out+1'b1;
大家看看这道题怎么做的
哪个公司的笔试题啊,我记得verilog描述是与工艺什么无关的啊!功耗都跑到描述上!
你这个描述也太简单了啊 ,好象优化面积也难哦,那就降频率试试吧!
看你的那个rst信号的描述,综合工具也肯定抱错
我劝您老不要去这家公司了
出这样的题,一来说明这家公司可能水平极极高,世界上没多少人能进
要么就是个垃圾公司,没水平的,不值得去!
rst 写错了,应该是negedge rst。这是nvidia的笔试题,题目就是那么说的,我想了下也没什么思路,有人有好办法吗。
估计是控制寄存器使能,不需要变化的寄存器不动作。
计数器要降低功耗 估计也就是使用格雷码吧
降低功耗的结果往往是面积变大. 可能是在加法器上做文章.
这是一个8位的异步复位的二进制循环计数器。还有其它条件吧?
真的想不出什么头绪啊。
那个大虾出来指点。
:lol 这个老兄,你看来对等效电阻这个东东很不理解吧!面积大了,等效电阻也大了啊,功耗却能降低!
牛!你是什么工厂的,以后华为的芯片找你代工生产
我估计使用gate-clock的做法,对于时序电路来说,如果能在不用的时候把clock gating,power会有不小的降低阿!
个人认为,是不是要把cnt一bit 一bit的分开写啊,因为lsb的翻转明显要比msb次数频繁,分开写后,加clock gating cell,就可以降低power了。
我的第一个感觉也是用gray码来完成。
但是如果使用gray码来做这件事情,还有需要考虑的地方。
在+1电路前面需要加一级gray->bin的转换,在reg之后需要bin->gray的电路。8bit的翻转节省的开销,和增加了两个组合电路的开销,需要一个考量。因为毕竟对于功耗的计算公式里的翻转率来说,是指mos的翻转,而不是reg的翻转。
是不是把加1电路去掉,直接做成8位异步复位计数器,每一级输出作为下一级的使能?
器件减少,功耗怎么样,没考虑过啊
感觉应该是使用gray码计数,也不一定要将两者之间转换吧,看这个计数的结果怎么来用。
平时都是这么写的,还能优化!~
减少翻转次数降低功耗肯定是不会错的
可以将同步复位改成异步复位试试
我做后端的,只会做clock gating优化功耗。
不知道是小编要求没说清楚,还是题目就是这样。
wu
好难的题呀
8bit寄存器分成两组,每4bit一组,高四位的寄存器可以采用门控时钟降低功耗
采用gray码可以降一部分功耗,但是如果每个时钟沿都有clock的话,即使输入信号不变,寄存器也有一半的管子跳变,会耗功耗。
看着简单,无从下手
看着简单,无从下手
学习一下
学习一下,这也太高深了
不错。下下来学习一下,谢谢小编了
我也不会,来看一下。
用门控时钟是比较省功耗的但危险容易有毛刺,用格雷码有效果但不会很明显,用低位翻转做高位的时钟看似好一些但速度可能有时跟不上!
郁闷,题目很难啊....小编快说答案....
看看这个行不
wire update1,updata2,update3,update4,updata5,update6,update7;
assign update1 = out[0];
assign update2 = update1 & out[1];
assign update3 = update2 & out[2];
assign update4 = update3 & out[3];
assign update5 = update4 & out[4];
assign update6 = update5 & out[5];
assign update7 = update6 & out[6];
always @(posedge clk or negedge rst)
begin
if (!rst)
out[0] <= 1'b0;
else
out[0] <= ~out[0];
end
always @(posedge clk or negedge rst)
begin
if (!rst)
out[1] <= 1'b0;
else if (update1)
out[1] <= ~out[1];
end
always @(posedge clk or negedge rst)
begin
if (!rst)
out[2] <= 1'b0;
else if (update2)
out[2] <= ~out[2];
end
always @(posedge clk or negedge rst)
begin
if (!rst)
out[3] <= 1'b0;
else if (update3)
out[3] <= ~out[3];
end
always @(posedge clk or negedge rst)
begin
if (!rst)
out[4] <= 1'b0;
else if (update4)
out[4] <= ~out[4];
end
always @(posedge clk or negedge rst)
begin
if (!rst)
out[5] <= 1'b0;
else if (update5)
out[5] <= ~out[5];
end
always @(posedge clk or negedge rst)
begin
if (!rst)
out[6] <= 1'b0;
else if (update6)
out[6] <= ~out[6];
end
always @(posedge clk or negedge rst)
begin
if (!rst)
out[7] <= 1'b0;
else if (update7)
out[7] <= ~out[7];
end
大家很有见解
always@(posedge[/email] clk&rst)
begin
if(!rst)
sum<='0;
else
sum<=sum+1;
end
always @ (posedge[/email] clk)
begin
flag <=rst;
end
assign gateclk =clk& flag;
always @ (posedge gateclk)
begin
if(! rst)
out <= 8'b00000000;
else
out <= out +1;
end
