Verilog log2 函数

使用系统函数 $clog2()或者自己写一个function注意,这样的style
input [$clog2(LEN+1)-1 -1:0] addra,它用不了funclog2函数。换一种style应该就ok了。

module simple_dual_ram #(
parameter SIZE  = 10,
  parameter LEN   = 1024
)
(
  input clka,
  input ena,
  input wea,
  input [$clog2(LEN+1)-1 -1:0] addra,//$clog2(8)=3; $clog2(9)=4
  input [SIZE-1:0] dina,
  input clkb,
  input enb,
  input [$clog2(LEN+1)-1 -1:0] addrb,//
  output reg [SIZE-1:0] doutb
);

function integer funclog2;
   input integer value;
   begin
     value = value-1;
     for (funclog2=0; value>0; funclog2=funclog2+1)
       value = value>>1;
   end
endfunction 

localparam TEST_LOG2 = funclog2(LEN);
reg [TEST_LOG2-1:0] r_test_log2;

reg [SIZE-1:0] r_data[LEN-1:0];
reg [$clog2(LEN+1)-1:0] r_cnt;//clog2(LEN+1)  clog2(1024+1) -> 11; LOG2(1023+1) -> 10

initial //cannot be synthesis
begin
  doutb <= {(SIZE-1){1‘b0}};
  for(r_cnt=0; r_cnt<LEN; r_cnt=r_cnt+1)
    r_data[r_cnt] <= {(SIZE-1){1‘b0}};
end

[email protected](posedge clka)
  if(wea&ena)
    r_data[addra] <= dina;

[email protected](posedge clkb)
  if(enb)
    doutb <= r_data[addrb];

endmodule

时间: 2024-10-29 00:19:13

Verilog log2 函数的相关文章

Verilog中函数与任务比较

http://blog.163.com/taofenfang_05/blog/static/64214093201181692057682/ 任务和函数只能实现组合逻辑,而对时序逻辑无能为力. 1  任务 任务就是一段封装在“task-endtask”之间的程序.任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的.调用某个任务时可能需要它处理某些数据并返回操作结果,所以任务应当有接收数据的输入端和返回数据的输出端. 任务可以彼此

verilog系统函数用法

1.$fwrite 向文件写入数据 格式:$fwrite(fid,"%h%h\n",dout_r1,dout_r2);(1)fwrite是需要触发条件的,在一次触发条件之后也不会自动发生换行,所以要求手动添加换行.(2)如果写放文件的格式为%d,则认为是无符号数,如下例:wire [27:0] data;fp_re = $fopen("dout.txt","w");always @(posedge clk) begin if(dout_rdy =

C++模板编程:如何使非通用的模板函数实现声明和定义分离

我们在编写C++类库时,为了隐藏实现,往往只能忍痛舍弃模版的强大特性.但如果我们只需要有限的几个类型的模版实现,并且不允许用户传入其他类型时,我们就可以将实例化的代码放在cpp文件中实现了.然而,当我们又需要针对特定类型进行模版偏特化时,由于gcc编译器不允许直接在类中进行偏特化声明,所以正确的写法变得比较复杂.本文通过一个简单的求log2函数的例子,提供了一个在cpp中同时进行偏特化和实例化的一般写法,并且可以使用static_assert在编译期检查参数的实现. 现在假设我们有一个叫做"Ma

Verilog HDL笔记

模块 模块介绍 模块是Verilog HDL语言的基本单元,数字系统是用模块的形式来描述. 模块是描述某个设计的功能.结构和其他模块通信的外部端口. Verilog HDL中的各个模块是并行运行的 模块可以调用其他模块的实例 模块结构 module <模块名>(<端口列表>) 端口说明(input,output,inout) 参数定义(可选) 数据类型定义//wire.reg.task.function 连续赋值语句(assign)//组合逻辑 过程块(always和initial

文件读写追加、函数、入门装饰器

1.文件操作 1.文件名称 2.字符编码 3.动作mode.读写等... f1,文件句柄,file 或者f_handle,f_obj open 打开的指令,windows的指令,windows编码方式默认gbk:linux:utf-8 1)打开文件,产生文件句柄 2)操作文件,操作文件句柄 3)关闭文件 r全读  rb非文字类  r+ r+b w  wb  w+ w+b a  ab  a+ a+b 绝对路径的 f1 = open(r'E:\sss.txt',encoding='gbk')cot

poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】

题目地址:http://poj.org/problem?id=3264 Sample Input 6 3 1 7 3 4 2 5 1 5 4 6 2 2 Sample Output 6 3 0分析:标准的模板题,可以用线段树写,但用RMQ-ST来写代码比较短.每次输出区间[L, R]内最大值和最小值的差是多少.注意一个地方,代码里面用到了log2()函数,但是我用包含<math.h>和<cmath>头文件的代码以C++的方式提交到POJ反馈是编译错误.改成g++提交才AC了.(注意

modelsim脚本文件的编写

第一章 ModelSim介 绍 本指南是为 ModelSim5.5f版本编写的,该版本运行于UNIX和Microsoft Windows 95/98/Me/NT/2000的操作系统环境中.本指南覆盖了VHDL和Verilog模拟仿真,但是你在学习过程中会发现对于单纯的HDL设计工作而言,它是一个很有用的参考.ModelSim具备强大的模拟仿真功能,在设计.编译.仿真.测试.调试开发过程中,有一整套工具供你使用,而且操作起来极其灵活,可以通过菜单.快捷键和命令行的方式进行工作.ModelSim的窗

《机器学习》(周志华)第4章 决策树 笔记 理论及实现——“西瓜树”

参考书籍:<机器学习>(周志华) 说       明:本篇内容为读书笔记,主要参考教材为<机器学习>(周志华).详细内容请参阅书籍——第4章 决策树.部分内容参考网络资源,在此感谢所有原创者的工作. ================================================================= 第一部分 理论基础 1. 纯度(purity) 对于一个分支结点,如果该结点所包含的样本都属于同一类,那么它的纯度为1,而我们总是希望纯度越高越好,也就是

提高篇(1):RMQ问题与ST表

RMQ是英文Range Minimum/Maximum Query的缩写,是询问某个区间内的最值,这里讲一种解法:ST算法 ST算法通常用在要多次(10^6级别)询问区间最值的问题中,相比于线段树,它实现更简单,效率更高,但不支持修改,且一般只能维护最值. ST算法实际上是动规,原理如下: 预处理: 一组数a[1]..a[n],设f[i][j]表示从a[i]到a[i+2^j-1]这个范围中的最值,元素个数为2^j个. 可以分成2部分,即从a[i]至a[i+2^(j-1)-1]与a[i+2^(j-