03 可配置表决器设计与功能验证(附源码)
虚拟机:VMware -14.0.0.24051
环 境:ubuntu 18.04.1
脚 本:makefile(点击直达)
应用工具:vcs 和 verdi
文章目录
- 一、Demand
- 二、Block Diagram
- 三、Design and Functional Verification
- (1)RTL
- (2)Test Bench
- 四、Result
一、Demand
实现参数化表决功能,可配置为2N+1人表决功能,多数表决通过则通过。在模块中定义一个N位的输入in来表示N个参与表决的人,然后利用for循环计算in中有多少位为1,如果有大于等于(N+1)/2位的1,则表示多数人同意,通过,反之不通过。
二、Block Diagram


三、Design and Functional Verification
(1)RTL
//-- modified by xlinxdu, 2022/04/26module vote
#(parameter NUM = 3,parameter WIDTH = 2
)
(input clk_i ,input rst_n_i,input [NUM-1:0] in ,output reg pass_o
);reg [WIDTH-1:0] cnt ;integer i ;wire pass;always @ (*) begincnt = 2'b0;for(i=0;i<NUM;i=i+1) begincnt = cnt + in[i];end
endassign pass = (cnt >= ((NUM+1)/2))? 1'b1:1'b0;always @ (posedge clk_i or negedge rst_n_i) beginif (!rst_n_i) beginpass_o <= 1'b0;endelse beginpass_o <= pass;end
end
endmodule
(2)Test Bench
//-- modified by xlinxdu, 2022/04/26
module tb_vote;reg clk_i;reg rst_n_i;reg [2:0] in;wire pass_o;initial beginclk_i = 0 ;rst_n_i = 1;in = 3'b000;#10 rst_n_i = 0;#10 rst_n_i = 1;
end
always #50 in = {$random}%7;
always #25 clk_i = ~clk_i;vote tb_vote(.clk_i(clk_i),.rst_n_i(rst_n_i),.in(in),.pass_o(pass_o));initial begin#10000 $finish;$fsdbDumpfile(".fsdb");$fsdbDumpvars ;$fsdbDumpMDA ;
endendmodule
四、Result

由上述结果可知,在配置N=3是,多数人即大于等于两人表决则表示通过,pass输出1,模块数据通路是正常的,功能验证通过。
注意:在计算个数时,需要初始化cnt的值。
作者:xlinxdu
版权:本文是作者原创,版权归作者所有。
转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
